当前位置: 首页 > 知识库问答 >
问题:

Excel VBA MySql参数化更新“无效的参数类型”

苏弘盛
2023-03-14

我正在创建一个界面,用户可以使用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,有一个issues_and_ougages表,其中列有:

>

  • ID(整数、无符号、键、auto_increment)

    位置(varchar(255),可为空)

    更新单元格(单元格应更新位置列)时,错误为

    “运行时错误”-2147217887(80040E21)“:[MySQL][ODBC 8.0(a)驱动程序][MySQLD-8.0.16]无效的参数类型”

    是给定的,但在cm.execute行上有一个错误。但是,数据库有一个大小为255的varchar类型列,它应该是adVarChar,所以我不希望出现错误。

  • 共有1个答案

    戎永福
    2023-03-14

    正如我们经常讨论的那样,大多数提供程序/驱动程序的ADO API不支持非存储过程SQL语句的命名参数。而是使用qmark,positional参数样式。

    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
    
     类似资料:
    • 致命错误:C:\xampp\htdocs\otakutangerang_admin\C_action.php:33堆栈跟踪:#0 C:\xampp\htdocs\otakutangerang_admin\C_action.php(33):PDO语句中出现未捕获的异常“PDOException”,并显示消息“SQLSTATE[HY093]:参数编号无效”-

    • 那里我从最早的网站上买了一些模板,预览版的一切都很好,但新的版本出现了类似这样的错误 我相信模板不应该有这个错误,但我仍然有它。会有什么问题?

    • 问题内容: 有人知道为什么chrome参数不起作用吗? 我也尝试过在切换台之前不加“-”并仅给出一个参数… Chrome启动,但没有激活的标志。 我使用最新的chromedriver。 问题答案: 我最近发现的类不与当前的硒和铬出于某种原因(如硒2.33.0,铬30和2013年7月)正常工作。 我相信,我链接的答案也是您解决问题的方法。只需使用,这些对我来说一直很好:

    • 我想让它在每天每小时的第5,15,25,35,45和55分钟运行。这似乎与这里的AWS调度事件文档一致http://docs.AWS.amazon.com/amazoncloudwatch/latest/Events/scheduledevents.html。 上面的文档允许用0到59之间的逗号分隔值表示分钟,并使用*通配符反映小时、月日(或周日)、月和年。 我尝试在Lambda控制台(创建函数并

    • 我正在上载excel工作表,并希望将其数据移动到数据库中的另一个表中。最近两天我收到了一个错误(),但是,如果我设计了一个非常简单的应用程序,它就可以正常工作。请帮帮我

    • 当我试图从我的api中点击以从keydove对用户进行身份验证时,它给了我一个错误无效参数:keydove页面上的redirect_uri。除了师父,我创造了自己的王国。KeyClope正在http上运行。请帮帮我。