我们得到了这是在2000年开发了一些旧的遗留应用程序,我们已经从接入移动2003至2007年当我试图运行的应用程序的模块,它给我的错误:如何将代码从DAO重写到ADO?
"Run-time error 3847. ODBCDirect is no longer supported. Rewrite the code to use ADO instead of 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 WorkSpace的情况下工作。 – Gustav
我会把整个东西移植到SQL Server免费版。我最近在Access上花费了大量的时间和精力。可怕。 –
我已经重新格式化了您的问题以修复代码块,但您的问题本质上*太宽泛*。您可以在[Documentation.SO](http://stackoverflow.com/documentation/vba/3578/working-with-ado#t=201612301821243706514)中找到有关ADO的信息;一旦你被困在一个特定的问题上,你就会有一个*特定的问题,我们将能够给你特定的答案。现在看起来你要求其他人为你做“翻译”工作,这不是Stack Overflow的目的。 –