2016-12-30 5 views
0

Мы получили некоторые старые унаследованное приложение, которое было разработано в 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 
+0

Будет много работы по переписыванию в ADO. В качестве альтернативы, модифицируйте - все еще используя DAO - для работы без ODBC WorkSpace. – Gustav

+1

Я отправил все это на бесплатную версию SQL Server. Я проводил время с Access, в последнее время все еще загружается ошибка. Кошмарный. –

+1

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

ответ

2

Во-первых, вы действительно не хотите вводить ADO в приложение, построенное и спроектированное вокруг DAO. Хуже того, ADO уже вот уже 15 лет. На самом деле SQL-сервер отказывается от поддержки oleDB, над которым работает ADO. (так что не ходите туда).

Смотрите эту ссылку о SQL сервер капельной поддержки OLEDB:

http://blogs.msdn.com/b/sqlnativeclient/archive/2011/08/29/microsoft-is-aligning-with-odbc-for-native-relational-data-access.aspx

промышленность отошла от ADO и всех основных поставщиков предлагает использовать Open Database Connectivity в качестве промышленного стандарта. (это означает ODBC).

Я хотел бы создать и сохранить запрос доступа в Access. Затем вы можете переписать код следующим образом:

Public Function GetID(ByRef SegmentItem As String) As Long 

    Dim strSQL  As String 

    strSQL = "sp_Insert('" & _ 
      Left(Form_frmQuickAdd_AddNatural.txtSegmentDescription, 34) & "'," & _ 
      "'" & CurrentUser & "', 0)" 

    With CurrentDb.QueryDefs("qryPass") 
    .SQL = strSQL 
    .ReturnsRecords = False 
    .Execute 
    End If 

    With CurrentDb.QueryDefs("qryPass") 
    .SQL = "sp_GetNewSegmentID" 
    .ReturnsRecords = True 
    GetID = Nz(.OpenRecordset()("MaxOfSegmentID"),0) 
    End With 

End Function 

Итак, создайте один запрос на проход. И вы можете использовать его довольно часто во всех местах, где вы использовали JET-DIRECT. В Access 2007 поддержка Jet-Direct была отброшена, но использование простого запроса pass-while будет более чем достаточным, а также, как показано выше, сохраните ведра времени кодирования и разработчика. Если у вас есть «левое» выражение, вы можете вернуть нуль, тогда вам, вероятно, понадобится обернуть это выражение в nz(), чтобы вернуть «» (нулевую строку) или соответствующее значение.

+0

Благодарим вас за ответ. Я изучаю сквозной запрос онлайн. Итак, «qrypass» выше - это сквозной запрос, правильно? Что входит в сквозной запрос? Это процедура магазина sp_insert? – toofaced

+0

Вы можете разместить все, что хотите, в запросе pass-while. Так что просто проверьте PT с помощью простого подсчета (*) от tblCustomers. Запрос PT может начинаться с любой законной инструкции t-sql. Выше показано, что вы «часто» модифицируете текстовое свойство .SQL этого PT запроса на все, что на ходу. Поэтому сначала проверьте PT-запрос, щелкнув по нему, чтобы запустить его. После того, как работающий выше код изменяет свойство .SQL, как указано выше, на лету. Это позволяет вам использовать + использовать ЛЮБОЙ t-sql в этом PT-запросе. Это также означает, что вы не связываетесь со строками подключения в коде и хорошо работаете для замены прямого кода. –

+0

any yes in above qryPass - это имя, которое я использовал для запроса PT - это может быть любое имя, которое вы хотите. Этот подход предпочтителен, так как остальная часть вашего кода набора DAO не должна быть переписана и будет работать по-прежнему. Таким образом, этот подход приводит к наименьшему количеству изменений в существующем коде набора DAO. –

Смежные вопросы