Параметризация с использованием условия IN в SQL в VBA - PullRequest
1 голос
/ 23 апреля 2020

Я только что начал параметризовать все свои запросы, поскольку у меня должно быть длинное go!

Поэтому моя цель состояла в том, чтобы создать «параметризационную функцию», которая возвращала бы набор записей ADO.

Я создал массивы, которые отправляю функции.

Это работает нормально, за исключением случаев, когда в строке SQL я использую что-то вроде

SELECT * FROM tblChemists WHERE chemistID в (?) И chemName LIKE "%" И chemDelFee = 5.5

В этой ситуации он не выдает ошибку, а возвращает только первую запись, на которую я ссылался в разделе (?). например. когда я использую параметр «30,31», он возвращает данные для ID = 30, но если я переключаю его и запрашиваю 31,30, тогда я получаю данные ID 31!

Это, очевидно, означает, что что-то не так с моим параметром, а не с моей sql строкой (которая, кстати, если я запускаю ее вручную в MYSQL WORKBENCH, она дает обе записи)

Это функция, которую я использую.

Public Function getRSTparam(strSQL As String, paramValue As Variant, paramType As Variant, paramLength As Variant, Optional skip As Boolean) As ADODB.Recordset

    Dim Cn As ADODB.Connection
    Dim Cm As ADODB.Command
    Dim Pm As ADODB.parameter
    Dim Rs As ADODB.Recordset
Set db = CurrentDb

Set Cn = New ADODB.Connection
    Cn.Open ADOoCon
    Set Cm = New ADODB.Command
    With Cm
        .ActiveConnection = Cn
        .CommandText = strSQL
        .CommandType = adCmdText

    For i = LBound(paramValue) To UBound(paramValue)
        .Parameters.Append .CreateParameter("ChemID", paramType(i), adParamInput, paramLength(i), paramValue(i))
       Next i

        Set getRSTparam = .Execute
    End With

End Function

и вот как я это называю.

Private Sub btnTest2_Click()
'testparam
Dim str As String


  str = "SELECT * FROM tblChemists WHERE chemistID in (?) AND chemName LIKE ? AND chemDelFee = ?"

Dim arrValue As Variant
  Dim arrType As Variant

  arrValue = Array("31,30", "%a%", 5.5)
  arrType = Array(adVarChar, adVarChar, adDouble)
  arrLength = Array(10, 50, 5)

Dim Rs As ADODB.Recordset
Set Rs = getRSTparam(str, arrValue, arrType, arrLength)

Rs.MoveFirst
Debug.Print Rs.RecordCount
  Do Until Rs.EOF

Debug.Print Rs!ChemName
    Rs.MoveNext
  Loop
End Sub

Так что теперь я немного застрял, так как не знаю, как использовать два идентификатора в состоянии IN!

Любой помощь или даже доработка кода была бы отличной! :)

...