【发布时间】:2016-01-14 09:07:10
【问题描述】:
项目使用:
- Access 2013 数据库源是 .accdb(称为“源”)
- 访问 2013 数据库 .accde 的源。 (称为“CurrentVersion”)
- 用户在其 C:\AccessSystems 文件夹中拥有 CurrentVersion 的副本(称为“UserVersion”)
- 链接到名为
VersionControl2013的“源”的 SQL 数据库表。
表格包含:System_Name、Version_Number、MDE_Path_Name和MDE_Name。
流程:
开发者对源代码进行更改
开发人员将类别更新为下一个版本号。类别位于数据库属性中。
开发人员创建 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 将它带到 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