Использование переменной в запросе SQL вызывает ошибку ADO - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь получить один код элемента из таблицы SQL сервера (элементы) для сравнения с кодом элемента, введенным в лист Excel. Чтобы сделать это возможным, я написал следующий код VBA в Excel 2019.

Function GetItemcodeFromSQLTable(sSQLArtikel As String) As String

    Dim connection As New ADODB.connection

    connection.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=SQL01;Initial Catalog=110"

    Dim query As String
    query = "select itemcode from items where itemcode = " & sSQLArtikel

    Dim rs As New ADODB.Recordset

    rs.Open query, connection

    connection.Close

End Function

Я получаю сообщение об ошибке при выполнении строки rs.open query, connection.

Цель всего этого в том, что я хотите знать, существует ли уже код товара в таблице SQL или нет. Если нет, то остальная часть моего кода VBA создаст файл XML для импорта нового кода элемента в таблицу SQL.

Я добавил ссылку на «Библиотеку объектов данных Microsoft Active X 6.1» в окно VBA.

Кто-нибудь может мне помочь с этой проблемой?

Большое спасибо.

Код, который я использую сейчас:

Function CheckIfArticleCodeExistsInSQLDatabase(sSQLArtikel As String) As String

Dim query As String
Dim connection As ADODB.connection
Dim rs As ADODB.Record
Dim cmd As ADODB.Command


' PREPARED STATEMENT WITH PARAM PLACEHOLDERS
query = "select itemcode from items where itemcode = " & "'" & sSQLArtikel & "'"

' OPEN CONNECTION
Set connection = New ADODB.connection
connection.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;" _
                   & "Data Source=SQL01;Initial Catalog=110"

' DEFINE COMMAND AND RECORDSET
Set cmd = New ADODB.Command
cmd.ActiveConnection = connection

Set rs = cmd.Execute(query, sSQLArtikel)    ' BIND PARAM VALUES

' ... DO SOMETHING WITH rs

rs.Close: connection.Close
Set cmd = Nothing: Set rs = Nothing: Set connection = Nothing

End Function

Когда при выполнении команды «Set rs = cmd.Execute (query, sSQLArtikel)» отображается сообщение об ошибке «текст команды не задан для объекта команды».

Я делаю что-то не так, но что?

1 Ответ

1 голос
/ 09 июля 2020

Учитывайте передовую отраслевую практику параметризации при запуске SQL на уровне приложения, таком как VBA. Таким образом вы избежите необходимости объединять и разделять переменные в строку SQL.

В частности, проблема заключается в отсутствии кавычек вокруг строковых литералов (sSQLArtikel). С помощью ADO Command.Execute вы можете определять наборы записей со связанными параметрами.

Dim query As String
Dim connection As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command

' PREPARED STATEMENT WITH PARAM PLACEHOLDERS
query = "select itemcode from items where itemcode = ?"

' OPEN CONNECTION
Set connection = New ADODB.Connection
connection.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;" _
                   & "Data Source=SQL01;Initial Catalog=110"

' DEFINE COMMAND AND RECORDSET
Set cmd = New ADODB.Command

With cmd
    .ActiveConnection = connection
    .CommandType = adCmdText
    .CommandText = query
    .Parameters.Append .CreateParameter(, adVarChar, adParamInput, _
                                        Len(sSQLArtikel), sSQLArtikel)
    Set rs = .Execute
End With

' ... DO SOMETHING WITH rs

rs.Close: connection.Close
Set cmd = Nothing: Set rs = Nothing: Set connection = Nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...