Мы получили некоторые старые унаследованное приложение, которое было разработано в 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, в последнее время все еще загружается ошибка. Кошмарный. –
Я переформатировал ваш вопрос, чтобы исправить блоки кода, но ваш вопрос по существу * слишком широк * на данный момент. Вы можете найти информацию об ADO в [Documentation.SO] (http://stackoverflow.com/documentation/vba/3578/working-with-ado#t=201612301821243706514); как только вы застряли в * конкретной проблеме, у вас будет * конкретный * вопрос, и мы сможем дать вам * конкретные * ответы. Сейчас похоже, что вы просите других людей выполнить «перевод» для вас, а это не то, что для переполнения стека. –