mysql - Excel VBA MySql 参数化更新'无效参数类型'
问题描述
我正在创建一个界面,用户可以在其中使用 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_outages 表,列有:
id(整数、无符号、键、auto_increment)
位置(varchar(255),可为空)
更新应该更新位置列的单元格时,出现错误
“运行时错误 '-2147217887 (80040e21)': [MySQL][ODBC 8.0(a) Driver][mysqld-8.0.16] 参数类型无效”
给出,在 Cm.Execute 行上有错误。但是,数据库有一个大小为 255 的 varchar 类型的列,它应该是一个 adVarChar,所以我不希望出现错误。
解决方案
正如这个SO answer经常讨论和总结的那样,大多数提供程序/驱动程序的 ADO API 不支持非存储过程 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
推荐阅读
- javascript - 如何从选择选项中更新状态?
- signalr - 使用 SignalR 进行微服务设计
- ruby-on-rails - 在生产环境中运行时如何在 Rails 控制台中查看详细的错误日志?
- python - 输入批量大小与 CrossEntropyLoss 函数中的目标批量大小不匹配
- javascript - 没有为 JavaScript (JSX) 配置命令!Scrimba“学习反应”课程
- python - 如何为 python py3rijndael 模块生成 AES 随机密钥
- kivy - 从树莓中的cli运行的kivy应用程序中没有鼠标移动或触摸
- c++ - 我应该怎么做才能在我的 C++ 项目中使用来自其他库的 MFC 对话框?
- docusignapi - ISV 合作伙伴 Docusign API 身份验证同意书
- php - 强制 WooCommerce 变化的 PHP 脚本