Excel VBA MySql параметризованное обновление «неверный тип параметра» - PullRequest
1 голос
/ 25 июня 2019

Я создаю интерфейс, в котором пользователи могут использовать Excel для плавного изменения базы данных SQL.Я могу нормально получать данные, однако при обновлении записей я получаю «недопустимый тип параметра».

Он прекрасно работает, просто объединяя значения в запросе, однако для предотвращения SQL-инъекций мне требуется параметризованный запрос.Я попытался заменить в типе данных ADO значение, однако это ничего не изменило.Я пробовал неназванные параметры, которые просто всегда отправляют в базу данных значение 16 вместо желаемого строкового значения

Private Sub Worksheet_Change(ByVal Target As Range)
        ID = Cells(Target.Row, 1).Value
        Dim locValue As String
        locValue = Cells(Target.Row, 2).Value

        Dim Cm As ADODB.Command
        Set Cm = New ADODB.Command

        Cm.NamedParameters = True
        Cm.CommandText = "UPDATE issues SET " _
        & "location = @location " _
        & "WHERE id = " & ID

        Dim locationParameter As ADODB.Parameter

        Set locationParameter = Cm.CreateParameter("@location", adVarChar, adParamInput, 255)
        Cm.Parameters.Append locationParameter
        locationParameter.Value = locValue

        SqlConnection(Cm)
End Sub

(я знаю, что ID еще не параметризован, проблема связана с расположением)

Public Function SqlConnection(Cm As ADODB.Command) As ADODB.Recordset
 Dim Cn As ADODB.Connection
    Dim Server_Name As String
    Dim Database_Name As String
    Dim User_ID As String
    Dim Password As String
    Dim SQLStr As String

    Server_Name = "127.0.0.1" ' Enter your server name here
    Database_Name = "issues_and_outages" ' Enter your  database name here
    User_ID = "root" ' enter your user ID here
    Password = "password" ' Enter your password here

    Set Cn = New ADODB.Connection
    Cn.Open "Driver={MySQL ODBC 8.0 ANSI Driver};Server=" & Server_Name & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"

    Cm.CommandType = adCmdText
    Cm.ActiveConnection = Cn

    Set SqlConnection = Cm.Execute

End Function

Сервер MySQL с таблицей questions_and_outages, имеющей столбцы с:

  • id (целое число, без знака, ключ, auto_increment)

  • location (varchar (255), обнуляемый)

При обновлении ячейки, которая должна обновлять столбец местоположения, возникает ошибка

"Run-ошибка времени '-2147217887 (80040e21)': [MySQL] [драйвер ODBC 8.0 (a)] [mysqld-8.0.16] Указан неверный тип параметра "

, с ошибкой в ​​строке Cm.Execute,Однако в базе данных есть столбец типа varchar размером 255, который должен быть adVarChar, поэтому я не ожидаю ошибки.

1 Ответ

0 голосов
/ 25 июня 2019

Как регулярно обсуждается и заканчивается этим SO-ответом , API ADO для большинства провайдеров / драйверов не поддерживает именованные параметры для оператора SQL не хранимой процедуры. Вместо этого используйте qmark, стиль позиционных параметров.

Set Cm = New ADODB.Command

With Cm
    .ActiveConnection = Cn
    .CommandType = adCmdText
    .CommandText = "UPDATE issues SET location = ? WHERE id = ?"

    .Parameters.Append .CreateParameter("loc_param", adVarChar, adParamInput, 255, locValue)
    .Parameters.Append .CreateParameter("id_param", adInteger, adParamInput,, ID)

    .Execute
End With
...