Sql 命令$()在Access 2007中可用,但在Access 2013中不可用
项目使用: 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由用户打开,打开时使用以下代码检查版本是否匹配: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
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。不用再做了。