我們得到了這是在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的目的。 –