【发布时间】:2017-05-14 23:40:44
【问题描述】:
我们有一些旧的遗留应用程序是在 2000 年开发的,我们已经从 2003 年访问到 2007 年。当我尝试运行应用程序的模块时,它给了我一个错误:
“运行时错误 3847。不再支持 ODBCDirect。重写代码以使用 ADO 而不是 DAO”。
它突出显示到Set WS = CreateWorkspace("NewWS", "", "", dbUseODBC) 行。由于我对 Access 非常陌生,因此我在此处发布此问题之前进行了研究,但没有运气。我正在尝试重写代码以使用 ADO 而不是 DAO。
以下是我的旧 vba 代码:
Public Function GetID (ByRef SegmentItem As clsSegmentDefinitions) As Long
Dim qdf As QueryDef
Dim qdfNewID As QueryDef
Dim rs As Recordset
Dim rsNewID As Recordset
Dim NaturalDescription As String
Dim WS As Workspace
Dim con As Connection
Set WS = CreateWorkspace("NewWS", "", "", dbUseODBC)
WS.DefaultCursorDriver = dbUseODBCCursor
Set con = WS.OpenConnection("", , , SQLConnectString)
DoCmd.Hourglass False
DoCmd.OpenForm " frmQuickAdd_AddNatural ", , , , , acDialog, SegmentItem.AddValue
DoCmd.Hourglass True
If Form_frmQuickAdd_AddNatural.Tag Then
Set qdf = con.CreateQueryDef("", "{ ? = call sp_Insert(?, ?, ?) }")
qdf.Parameters.Refresh
qdf![@prmDescription] = Left(Form_frmQuickAdd_AddNatural.txtSegmentDescription, 34)
qdf![@prmCreateUser] = CurrentUser
qdf![@prmProjectID] = 0
qdf.Execute
Set qdfNewID = CodeDb.CreateQueryDef("")
qdfNewID.Connect = SQLConnectString
qdfNewID.ReturnsRecords = True
qdfNewID.SQL = "sp_GetNewSegmentID"
Set rsNewID = qdfNewID.OpenRecordset
If Not IsNull(rsNewID!MaxOfSegmentID) Then
GetID = rsNewID!MaxOfSegmentID
Else
GetID = 0
End If
Else
GetID = 0
End If
DoCmd.Close acForm, "frmQuickAdd_AddNatural"
End Function
我已经开始重写代码,但我不知道它是否应该是这样的。
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
cnn.Open "Provider=mssql;Data Source=" & dbq & ";User Id=" & uid & ";Password=" & pwd
With rst
.Open "SELECT COUNT(*) FROM " & tbl, cnn, adOpenKeyset, adLockOptimistic
num = .Fields(0)
.Close
End With
cnn.Close
Set rst = Nothing
Set cnn = Nothing
【问题讨论】:
-
改写成ADO会做很多工作。或者,修改 - 仍然使用 DAO - 以在没有 ODBC 工作区的情况下工作。
-
我会将整个内容移植到 SQL Server 免费版。我最近花时间在 Access 上仍然有很多错误。可怕。
-
我已重新格式化您的问题以修复代码块,但此时您的问题基本上过于宽泛。您可以在Documentation.SO 找到有关 ADO 的信息;一旦您遇到具体的问题,您就会有具体的问题,我们可以为您提供具体的答案。现在看起来你是在要求其他人为你做“翻译”工作,这不是 Stack Overflow 的目的。
-
@Mat'sMug:我将研究该文档。谢谢
-
@S Meaden: -- 用户已经在使用 SQL Server,并建议 SQL Server 不允许创建表单和 UI,这些表单和 UI 显然包含在给定的示例代码中。因此,除非您建议使用其他客户端开发工具,否则迁移到 SQL 并不能解决 UI 问题。 Access 是 Oracle 或在本例中是 SQL Server 的出色客户端。如前所述,用户已经在使用 SQL 服务器,并且存储过程名称在给定的示例代码中清晰可见。所以有问题的数据库引擎已经是 SQL 服务器。那么移植到 SQL Server 是如何允许构建表单和 UI 的呢?