Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 命令$()在Access 2007中可用,但在Access 2013中不可用_Sql_Ms Access_Vba_Ms Access 2007_Ms Access 2013 - Fatal编程技术网

Sql 命令$()在Access 2007中可用,但在Access 2013中不可用

Sql 命令$()在Access 2007中可用,但在Access 2013中不可用,sql,ms-access,vba,ms-access-2007,ms-access-2013,Sql,Ms Access,Vba,Ms Access 2007,Ms Access 2013,项目使用: Access 2013数据库源是作为源引用的.accdb Access 2013数据库。源的帐户。引用为当前版本 用户的C:\AccessSystems文件夹中有一个引用为UserVersion的CurrentVersion副本 链接到名为VersionControl2013的源的SQL数据库表。 表包含:系统名称、版本号、MDE\U路径名称和MDE\U名称。 流程: 开发人员在源代码中进行更改 开发人员将该类别更新为下一个版本号。类别位于数据库属性中 开发人员创建CurrentVe

项目使用:

Access 2013数据库源是作为源引用的.accdb Access 2013数据库。源的帐户。引用为当前版本 用户的C:\AccessSystems文件夹中有一个引用为UserVersion的CurrentVersion副本 链接到名为VersionControl2013的源的SQL数据库表。 表包含:系统名称、版本号、MDE\U路径名称和MDE\U名称。 流程:

开发人员在源代码中进行更改

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

开发人员创建CurrentVersion并将其保存到p:\驱动器,所有CurrentVersions都保存在该驱动器中

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

用户选择更新并运行代码以关闭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将其带到第行,DatabaseName为

我觉得行:ApplicationName=Command$与此有关,因为ApplicationName也是空的。它应该引入应用程序的名称


为什么它能在2007年工作,但不能在2013年工作?

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

这样称呼:

databasename = GetApplicationInformation()
Public Function GetApplicationInformation() As String
... 
GetApplicationInformation =  AnswerSet("MDE_Name") ' the database name
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd mySystemName"
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd " & Dir(CurrentDb.Name)
该函数如下所示:

databasename = GetApplicationInformation()
Public Function GetApplicationInformation() As String
... 
GetApplicationInformation =  AnswerSet("MDE_Name") ' the database name
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd mySystemName"
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd " & Dir(CurrentDb.Name)

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

这是一个相当复杂的系统

函数返回一个字符串,该字符串随/cmd开关追加到Access命令行

你必须像这样启动Access

"MSACCESS.EXE C:\mypath\Database1.accdb /cmd SomeString"
然后,若Database1.accdb调用该命令,它将返回一些字符串

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

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde"
没有/cmd开关,所以命令不会返回任何内容。 它是否可能在进入2013年的过程中迷失了方向

编辑:

如上所述,ApplicationName=Command$无法在较低的代码中工作,因为此处没有传递/cmd字符串:

Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde"
这里使用的是:

WHERE VersionControl2013.System_Name = " & "'" & ApplicationName & "'"
因此,您需要传递正确版本的control2013.System\u名称,如下所示:

databasename = GetApplicationInformation()
Public Function GetApplicationInformation() As String
... 
GetApplicationInformation =  AnswerSet("MDE_Name") ' the database name
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd mySystemName"
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd " & Dir(CurrentDb.Name)
或者,如果System_Name只是数据库用户版本名,则如下所示:

databasename = GetApplicationInformation()
Public Function GetApplicationInformation() As String
... 
GetApplicationInformation =  AnswerSet("MDE_Name") ' the database name
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd mySystemName"
Shell "MsAccess.exe " & "P:\AccessSystems\VersionControl\VersionControl2013.accde /cmd " & Dir(CurrentDb.Name)

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

谢谢……我将首先尝试Andre451的建议,如果不起作用……我将尝试你的建议。我尝试了两种建议,但都没有成功。不知何故,我需要将UserVersion数据库名称传递给LoadVersion Code…ApplicationName。@dspanogle的回答应该有效,因为您需要从函数而不是子例程返回DatabaseName。通过添加调试来检查Databasename是否为空。在应答集之前打印Databasename。关闭GetApplicationInformation sub并在底部的即时窗口中查看输出。还要检查SQL Server的VersionControl2013表,查看第一条记录是否包含MDE_名称字段中的数据,该字段是您要查询的行。新版本不是最后一张唱片吗?好吧…我尝试了两个建议,但没有任何进展。还有其他想法吗?再次感谢!使用Application.CurrentProject.FullName返回当前数据库文件的路径和名称。谢谢!我使用了安德烈451编辑的建议。它正在工作!:最后,我将所有DatabaseName更改为ApplicationName,使其保持一致。您遗漏了一个有趣的消息,VersionControl2013表是SQL Server数据库。请注意,SQL是一种编程语言,许多RDM都使用它,包括Oracle、SQL Server、Postgre、MySQL、DB2、SQLite,甚至还有带有Jet/ACE SQL引擎的MS Access!另外,为什么要在链接表(即VersionControl2013)上运行ADO连接?如果在当前数据库中作为当前文件中的链接表可用,请使用“MS Access”。在建立链接表时,您已经连接了ODBC。不用再做了。