Я только что начал параметризовать все свои запросы, поскольку у меня должно быть длинное 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!
Любой помощь или даже доработка кода была бы отличной! :)