【问题标题】:Command$() worked in Access 2007 but does not work in Access 2013Command$() 在 Access 2007 中有效,但在 Access 2013 中无效
【发布时间】:2016-01-14 09:07:10
【问题描述】:

项目使用:

  1. Access 2013 数据库源是 .accdb(称为“源”)
  2. 访问 2013 数据库 .accde 的源。 (称为“CurrentVersion”)
  3. 用户在其 C:\AccessSystems 文件夹中拥有 CurrentVersion 的副本(称为“UserVersion”)
  4. 链接到名为 VersionControl2013 的“源”的 SQL 数据库表。
    表格包含:System_NameVersion_NumberMDE_Path_NameMDE_Name

流程:

  1. 开发者对源代码进行更改

  2. 开发人员将类别更新为下一个版本号。类别位于数据库属性中。

  3. 开发人员创建 CurrentVersion 并将其保存到 P:\ 驱动器(保存所有 CurrentVersions 的位置)。

  4. 用户打开 UserVersion 并运行代码以检查它是否与 CurrentVersion 匹配。

  5. 用户选择更新并运行代码以关闭 UserVersion 并将 CurrentVersion 复制到用户的 c:\AccessSystems 文件夹。

现在...用户是最新的正确版本。

UserVersion 由用户打开,打开时使用以下代码检查版本是否匹配:

Public Sub CheckVersionNumber()
   Dim SQLConn As New ADODB.Connection
   Dim AnswerSet As New ADODB.Recordset
   Set dbs = CurrentDb
   Set cnt = dbs.Containers!Databases
   Set doc = cnt.documents!SummaryInfo
   doc.Properties.Refresh
   Set ThisVersion = doc.Properties("Category")
   Set SystemName = doc.Properties("Title")
   Set SQLConn = New ADODB.Connection
   SQLConn.Provider = "sqloledb"
   SQLConn.Open "Data Source=scgcserver1;Initial Catalog=SCGCDatawarehouse "
   QueryString = "SELECT VersionControl2013.* FROM VersionControl2013 WHERE (((VersionControl2013.System_Name)=" & "'" & SystemName & "'" & "));"
   AnswerSet.Open QueryString, SQLConn, , adCmdText
   If AnswerSet.EOF = False Then
      If RTrim(AnswerSet("Version_Number")) = ThisVersion Then
      Else
         MsgBox ("Version Number does not match")
         ServDir = "p:\accesssytems"
         Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde"
         Application.Quit
      End If
   End If
   AnswerSet.Close
   With SQLConn
       .Close
   End With    
End Sub

注意:以下代码在 Access 2007 中有效。在 Access 2013 中无效。

调用并打开 CurrentVersion 时,它会运行以下代码:

    Public Function LoadVersion()
     DialogMessage = "You have a previous version of the Application, Do you want to UPDATE your version?"
     DialogStyle = vbYesNo + vbDefaultButton1
     DialogTitle = "Update Application"
     DialogResponse = MsgBox(DialogMessage, DialogStyle, DialogTitle)
     If DialogResponse = vbYes Then
        ApplicationName = Command$()
        Call GetApplicationInformation
        DoCmd.Hourglass True
        ToDirectory = "C:\AccessSystems\" & RTrim(DatabaseName)
        FromDirectory = RTrim(MDEPathName) & RTrim(DatabaseName)
        FileCopy "p:\AccessSystems\compiles\Access2013Compiles\" & DatabaseName, "c:\AccessSystems\" & DatabaseName
        MsgBox ("Your Client Copy has been updated  - Thank You " & " " & ApplicationName & " " & DatabaseName)
        Shell "MsAccess.exe " & "C:\AccessSystems\" & RTrim(DatabaseName)

        Application.Quit
     End If
End Function


Public Sub GetApplicationInformation()
   Dim SQLConn As New ADODB.Connection
   Dim AnswerSet As New ADODB.Recordset

   Set SQLConn = New ADODB.Connection
   SQLConn.Provider = "sqloledb"
   SQLConn.Open "Data Source=scgcserver1;Initial Catalog=SCGCDatawarehouse "
   QueryString = "SELECT VersionControl2013.* FROM VersionControl2013 WHERE (((VersionControl2013.System_Name)=" & "'" & ApplicationName & "'" & "));"
   AnswerSet.Open QueryString, SQLConn, , adCmdText
   If AnswerSet.EOF = False Then
      DatabaseName = AnswerSet("MDE_Name")
      MDEPathName = AnswerSet("MDE_Path_Name")
   End If
   AnswerSet.Close
   With SQLConn
       .Close
   End With

End Sub

我得到一个运行时错误

52: 错误的文件名或编号。

Debug 将它带到 line 并且 DatabaseName 是 ""。

FileCopy "p:\AccessSystems\compiles\Access2013Compiles\" & DatabaseName, "c:\AccessSystems\" & DatabaseName

我觉得这条线:ApplicationName = Command$() 与它有关,因为ApplicationName 也是空白的。它应该引入应用程序的名称。

为什么它在 2007 年有效,而在 2013 年无效?

【问题讨论】:

  • 您忽略了VersionControl2013 表是SQL Server 数据库的有趣消息。请注意 SQL 是许多 RDMS 使用的编程语言,包括 Oracle、SQL Server、Postgre、MySQL、DB2、SQLite,甚至是带有 Jet/ACE SQL 引擎的 MS Access!
  • 另外,为什么要在链接表上运行 ADO 连接,即在 VersionControl2013 上?如果在当前数据库中作为当前文件中的链接表可用,请使用 MS Access'DLookUp()。您在建立链接表时已经连接了 ODBC。无需再做一次。

标签: sql ms-access vba ms-access-2007 ms-access-2013


【解决方案1】:

这是一个相当复杂的系统。

Command() 函数返回一个使用 /cmd 开关附加到 Access 命令行的字符串。

您必须启动 Access,例如像这样

"MSACCESS.EXE C:\mypath\Database1.accdb /cmd SomeString"

如果 Database1.accdb 调用Command(),它会返回“SomeString”。

但是如果我理解正确的话,上面的代码会启动下面的代码

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde"

没有 /cmd 开关,所以Command() 不会返回任何内容。
是不是在切换到 Access 2013 时迷路了?


编辑:

正如我上面写的,ApplicationName = Command$() 不能在较低的代码中工作,因为这里没有传递/cmd 字符串:

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde"

在这里使用:

WHERE VersionControl2013.System_Name = " & "'" & ApplicationName & "'"

所以你需要传递正确的VersionControl2013.System_Name,像这样:

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd mySystemName"

或者如果System_Name 只是数据库(UserVersion)名称,类似这样:

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd " & Dir(CurrentDb.Name)

我使用Dir()从完整路径中提取文件名。

【讨论】:

  • 好的...我尝试了这两个建议,但没有任何进展。还有其他想法吗?再次感谢!
  • 使用Application.CurrentProject.FullName返回当前数据库文件的路径和名称。
  • 谢谢!我使用了 Andre451 的编辑建议。这是工作! :) 我最终将所有“DatabaseName”更改为“ApplicationName”,所以它是一致的。
【解决方案2】:

也许我没有看到所有代码或遗漏了一些东西,但是...通常您需要将 DatabaseName 声明为所有子例程都可用的公共变量。 或者 .. 将值传递回调用语句。

这样调用:

databasename = GetApplicationInformation()

函数如下所示:

Public Function GetApplicationInformation() As String
... 
GetApplicationInformation =  AnswerSet("MDE_Name") ' the database name

但这当然不能解释为什么它在 Access 2007 中起作用。也许您提供的更多细节会有所帮助。

【讨论】:

  • 谢谢...我会先尝试Andre451的建议,如果不起作用...我会尝试您的建议。
  • 我已经尝试了这两个建议,但都没有奏效。不知何故,我需要将“UserVersion”数据库名称传递给 LoadVersion Code...ApplicationName。
  • @dspanogle 的答案应该可以工作,因为您需要从函数而不是子例程返回 DatabaseName。通过在 GetApplicationInformation() 子中的 AnswerSet.Close 之前添加 debug.Print DatabaseName 来检查 Databasename 是否为空,并在底部的即时窗口中查看输出。还要检查 SQL Server,VersionControl2013 表,看看第一条记录是否包含您正在查询的行的MDE_Name 字段中的数据。新版本不会是最后的记录吗?
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多