【问题标题】:How to set Adodb.Parameter? MySQL Invalid parameter type如何设置 Adodb.Parameter? MySQL 参数类型无效
【发布时间】:2023-04-05 03:09:01
【问题描述】:

我有一个非常直接且简单的存储过程,接受 1 个参数。当我从 VBA 调用 sp 时,我从 command.Execute 收到以下错误:

-2147217887 [MySQL][ODBC 5.3(w) 驱动程序][mysqld-5.7.31-log]参数类型无效

但是,从我的角度来看,我无法确定哪种参数类型不正确。我真的没脑子了

更新
Excel VBA MySql parameterised update 'invalid parameter type' 有完全相同的错误,但是,答案是针对非存储过程调用。

我的代码如下
存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_load_visit`(
IN _nid char(18)
)
BEGIN
SET @query = concat("
    select visiting_date, method, visiting_details from tbl_visit where visiting_customer=? order by visiting_date asc;
    ");
PREPARE stmt FROM @query;
SET @_nid = _nid;
EXECUTE stmt USING @_nid;
DEALLOCATE PREPARE stmt;
END

VBA 代码:

 Public Sub formControl_Update()
    Dim cmd As New ADODB.Command
    Dim conn As ADODB.Connection
    Dim prm As ADODB.Parameter
    Dim strConn As String
    Dim strSQL As String

    strConn = "Driver={MySQL ODBC 5.3 Unicode Driver};Server=127.0.0.1;Database=jkydb1;Uid=admin;pwd=123456"

    conn.Open strConn
   
    command.ActiveConnection = myConn
    command.CommandText = "sp_load_visit"
    command.CommandType = adCmdStoredProc
    command.CommandTimeout = 10
    command.NamedParameters = True
    command.Prepared = True
    Set prm = command.CreateParameter("_nid", adChar, adParamInput, 18, cell_customer_nid.value)
    command.Parameters.Append prm
    
    Set rs = command.Execute


End Sub

我读过的帖子: Parameter Object
run stored procedure and return values from VBA

【问题讨论】:

  • 如何知道参数在存储过程中的顺序是否正确? 执行SHOW CREATE PROCEDURE sp_UpdateUserInfo;,查找参数排序和类型。 PS。您没有在执行 SQL 的过程中指定参数...也许您必须使用类似 cmd.CommandText = "sp_UpdateUserInfo(OrderID, OrderDate)" 的东西?
  • 嗨@Akina,我的实际代码比这两个字段要多得多,如果我必须指定你输入的顺序,我也会重新安排从单元格获取值的顺序.
  • 不,您按名称添加参数,而不是按位置添加参数,因此添加值的顺序无关紧要。排序由 CALL 语句中提到的参数名称指定。
  • 你确定你用的是mysql吗?您的连接字符串是针对 ms sql 服务器的,因此如果您尝试使用它连接到 mysql 服务器,您的代码会抛出错误。
  • 嗨@Shadow,感谢您的评论!事实上,我从这个站点复制了连接字符串,因为我在提问时无法远程访问我的电脑

标签: mysql sql excel vba stored-procedures


【解决方案1】:

经过一些研究和测试,我发现解决这个问题的最佳方法是编写自定义插入、更新、删除、选择查询并使用recordSet.Open queryString, sqlConnection, adOpenStaticrecordSet 获取结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2013-06-15
    相关资源
    最近更新 更多