2016-12-22 2 views
0

Использование MS Access для завершения этого проекта.VBA - ADODB.Connection - использование параметров и восстановление записей, на которые ссылается счет

Я пытаюсь упростить код ADODB, удалив необходимость в объекте ADODB.Command. Существует два требования: необходимость использования параметров и необходимость восстановления затронутых записей (для проверки правильности выполнения SQL).

Синтаксис, который я пытаюсь использовать, упоминался в статье, зарегистрированной в блоке кода.

{подключение объекта}. [{Имя запроса}] {параметр 1, ..., п параметр [, набор записей объекта]}

сп. [TEST_ADODB_Connection] 204, Дата & "" & Время(), RS

Sub TEST_ADODB_Connection() 

'https://technet.microsoft.com/en-us/library/aa496035(v=sql.80).aspx 
'Using ADODB without the use of .Command 

Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 

Dim lngRecordsAffected As Long 

Set cn = CurrentProject.Connection 

'TEST_ADODB_Connection Query 
'INSERT INTO tbl_Log (LogID_Orig, LogMessage) 
'SELECT [NewLogID] AS _LogID, [NewLogMessage] AS _LogMessage; 

Set rs = New ADODB.Recordset 
cn.[TEST_ADODB_Connection] 204, Date & " " & Time(), rs 
lngRecordsAffected = rs.RecordCount 'Error 3704 - no records returned 
            'so this is expected, but how do we 
            'get records affected by the update query? 

Debug.Print lngRecordsAffected 

End Sub 

UPDATE

в том числе исходного кода, пытающегося быть упрощена.

Объект .Command предоставляет необходимую мне функциональность, но я ищу альтернативный метод, если это возможно.

В статье (https://technet.microsoft.com/en-us/library/aa496035(v=sql.80).aspx) приведен пример, где объект .Connection может быть выполнен с использованием параметров. Я пытаюсь распространить этот пример и получить затронутые записи.

Sub TEST_ADODB_Command() 

Dim cm As ADODB.Command 
Dim rs As ADODB.Recordset 

Dim iLogID_Auto As Integer 
Dim strLogMessage As String 

Dim lngRecordsAffected As Long 

Set cm = New ADODB.Command 

iLogID_Auto = 204 
strLogMessage = Date & " " & Time 

With cm 
    Set .ActiveConnection = CurrentProject.Connection 
    .CommandText = "TEST_ADODB_Connection" 
    .CommandType = adCmdStoredProc 
    .NamedParameters = True ' does not work in access 

    .Parameters.Append .CreateParameter("[NewLogID]", adInteger, adParamInput, , iLogID_Auto) 
    .Parameters.Append .CreateParameter("[NewLogMessage]", adVarChar, adParamInput, 2147483647, strLogMessage) 

    Set rs = .Execute(lngRecordsAffected) 

    Debug.Print lngRecordsAffected 
End With 

Set rs = Nothing 
Set cm = Nothing 

End Sub 
+1

Э, вы * хотите * использовать 'ADODB.Command'. * Особенно, если у вас будут параметры. –

+0

[ADODB.Command.Execute] (https://msdn.microsoft.com/en-us/library/ms681559 (v = vs.85).aspx) имеет параметр «RecordsAffected» –

+0

Возможно, вы захотите взять и настроить [этот код] (http://codereview.stackexchange.com/q/46312/23788) (и связанные сообщения), чтобы упростить код ADODB, не жертвуя надежность «ADODB.Command». –

ответ

0

Благодарим вас за комментарии. Я считаю, что разработал то, что искал.

Две точки

  • ADODB.Command необходим, если вы хотите вставить/обновить и получить количество записей с помощью параметров с помощью одного .Execute. Примеры этого можно найти по всему Интернету, включая мой оригинальный пост в разделе обновления.

  • ADODB.Command НЕ требуется, если у вас есть запрос на вставку/обновление и запрос выбора. Я не мог найти примеры этого метода. Ниже приведен пример, который я придумал.

Обзор Высокий уровень того, что происходит на

  • Выполните запрос вставки/обновления. Вставки/Обновления не возвращают recordSet с использованием метода одной строки.
  • Выполнение запроса выбора. Это вернет recordSet, однако я не смог заставить метод .Count работать так, как я думаю.
  • Предлагаемый tlemaster link обеспечил работу в разделе ответов. Работа вокруг заключается в том, чтобы пересмотреть запрос выбора для группировки результатов и использовать COUNT (*), чтобы вернуть счет. Возвращаемое значение затем используется вместо метода .Count.

    Sub TEST_ADODB_Connection() 
    'https://technet.microsoft.com/en-us/library/aa496035(v=sql.80).aspx 
    'Using ADODB without the use of .Command and .Parameters 
    
    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim lngRecordsAffected As Long 
    
    Dim strDateTime As String 
    Dim lngID As Long 
    
    Set cn = CurrentProject.Connection 
    strDateTime = Date & " " & Time() 
    lngID = 204 'random number for example purpose 
    
    'TEST_ADODB_Connection INSERT Query 
    'INSERT INTO tbl_Log (LogID_Orig, LogMessage) 
    'SELECT [NewLogID] AS _NewLogID, [NewLogMessage] AS _LogMessage; 
    
    'This line will execute the query with the given parameters 
    'NOTE: Be sure to have the parameters in the correct order 
    cn.[TEST_ADODB_Connection] lngID, strDateTime 
    
    'TEST_ADODB_Select 
    'SELECT Count(tbl_Log.LogID_Orig) AS recordCount 
    'FROM tbl_Log 
    'WHERE tbl_Log.LogID_Orig=[_LogID] AND tbl_Log.LogMessage=[_LogMessage]; 
    
    'Must initilize recordset object 
    Set rs = New ADODB.Recordset 
    
    'This line will execute the query with given parameters and store 
    'the returning records into the recordset object (rs) 
    'NOTE: Again, be sure the parameters are in the correct order 
    'NOTE: the recordset object is always the last argument 
    cn.[TEST_ADODB_Select] lngID, strDateTime, rs 
    
    'unable to directly utilize the .Count method of recordset 
    'workaround and more optimal solution is to write the SQL 
    'to return a count using grouping and Count(*) - see SQL above 
    lngRecordsAffected = rs("recordCount").Value 
    
    'Close recordset object 
    rs.Close 
    
    Debug.Print lngRecordsAffected 
    End Sub