- Код: Выделить всё
Function ExecSql(ByVal strSqlQuery As String, ByVal cnn As Object, ParamArray Param()) As Object
Dim cmd As Object 'New ADODB.Command
Dim Prm As Object 'New ADODB.Parameter
Dim i As Integer
On Error GoTo exception:
Set cmd = CreateObject("ADODB.Command")
Set Prm = CreateObject("ADODB.Parameter")
Set cmd.ActiveConnection = cnn
cmd.CommandText = strSqlQuery
cmd.CommandTimeout = 0
For i = LBound(Param) To UBound(Param)
Set Prm = cmd.CreateParameter("Prm", VarType(Param(i)), adParamInput, , Param(i))
Next
'выполнение запроса
Set ExecSql = cmd.Execute 'Ошибка возникает здесь
Exit Function
exception:
Set ExecSql = Nothing
MsgBox strSqlQuery & vbCrLf & "ExecSql() " & Err.Number & " " & Err.Description _
, vbCritical + vbSystemModal, PROGNAME & " Ошибка выполнения Sql запроса."
Set Prm = Nothing
Set cmd = Nothing
End Function
'В программе функция используется следующим образом
Public cnn As Object 'New ADODB.Connection
Public rs As Object 'ADODB.Recordset
Sub Main()
...
Set cnn = CreateObject("adodb.connection")
Set rs = CreateObject("adodb.recordset")
...
Set rs = ExecSql("select * from my_table where id=? and value < ?", cnn, intSearchedId,intSearchedValue)
PrintRs rs 'вывод результата на рабочий лист
ExecSql "{CALL pkg_log.write_log( ? )}", cnn, "Выборка завершена"
...
CloseRs rs
cnn.Close
Set cnn = Nothing
Exit Sub
exception:
MsgBox "Ошибка при формировании отчета." _
& vbCrLf & Err.Number & " " & Err.Description _
, vbCritical + vbSystemModal, PROGNAME
Resume NextLine
NextLine:
On Error Resume Next
ExecSql ExecSql "{CALL pkg_log.write_log( ? )}", cnn, "Ошибка при формировании отчета."
CloseRs rs
cnn.Close
Set cnn = Nothing
Unload Form1
End Sub
Экспериментально выяснил, что дело в строчке
- Код: Выделить всё
Set Prm = cmd.CreateParameter("Prm", VarType(Param(i)), adParamInput, , Param(i))
Или если создать временную переменную и передавать через нее, то же ошибки не будет.
- Код: Выделить всё
dim varTmp
varTmp= Param(i)
Set Prm = cmd.CreateParameter("Prm", VarType(varTmp), adParamInput, , varTmp)
После попыток решить эту проблему возник вопрос, а насколько вообще правильно делать вот такую функцию для выполнения запросов и насколько правильно я ее сделал?