You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET调用MariaDB存储过程提示参数数量不匹配错误如何解决

报错原因解析

Incorrect number of arguments for PROCEDURE ... expected 12. but 0
该报错含义是目标存储过程定义了12个输入参数,但执行请求中没有传入任何参数,MariaDB无法匹配到符合参数数量要求的存储过程,因此抛出异常。

核心错误定位

你的代码存在一处非常隐蔽的重复实例化逻辑漏洞:

Dim cmd As New MySqlCommand()
cmd.Connection = conn
cmd.CommandText = sStoreProcName
cmd.CommandType = CommandType.StoredProcedure ' 此处已正确配置为存储过程执行模式
InsertUpdateData = False
cmd = New MySqlCommand(sStoreProcName, conn) ' 此处重新实例化了MySqlCommand对象,前面配置的CommandType属性被清空,新对象默认是普通SQL文本执行模式,你后续添加的参数不会被作为存储过程入参传递

因为执行模式错误,最终发起数据库请求时没有携带任何参数,自然触发参数数量不匹配的报错。

修复方案

优先方案:删除重复实例化代码

直接删掉cmd = New MySqlCommand(sStoreProcName, conn)这一行即可,你此前已经完成了cmd对象的基础属性配置,无需重复实例化。

备选方案:补充执行模式配置

如果要保留重新实例化的代码,在该行后补充存储过程类型声明:

cmd = New MySqlCommand(sStoreProcName, conn)
cmd.CommandType = CommandType.StoredProcedure ' 新增这行配置
其他潜在问题修复建议
  • 参数名前缀匹配:MariaDB存储过程参数通常需要带@前缀,你需要确认存储过程定义的参数名和你代码中传入的sParamName完全一致,如果存储过程参数带@,可以在赋值参数名时统一添加:sParamName = "@" & arrParamName(0)
  • 数据类型匹配错误:你窗体端拼接的dblAmount、dblCreditedAmount等浮点类型参数,当前标记的类型是integer,会导致精度丢失或类型转换报错,建议修改为对应的double类型
  • 参数赋值逻辑优化:原代码使用的Add重载第四个参数是源列名,不是参数值,建议修改为显式赋值的写法,避免隐性错误
修复后核心参考代码
Try
    Dim arrParameter, arrParamName
    Dim sParamName As String
    Dim sDataValue As String
    Dim sDataTypes As String
    Dim lCtr As Long
    Dim cmd As New MySqlCommand()
    cmd.Connection = conn
    cmd.CommandText = sStoreProcName
    cmd.CommandType = CommandType.StoredProcedure
    InsertUpdateData = False
    arrParameter = Split(sParameterList, "|", , vbTextCompare)
    If Not Trim(sParameterList) = "" Then
        If UBound(arrParameter) >= 0 And IsArray(arrParameter) Then
            For lCtr = 0 To UBound(arrParameter)
                arrParamName = Split(arrParameter(lCtr), "$", , vbTextCompare)
                sParamName = arrParamName(0)
                ' 如需加@前缀取消下行注释
                ' sParamName = "@" & sParamName
                sDataTypes = arrParamName(1)
                sDataValue = arrParamName(2)
                Select Case sDataTypes.ToLower()
                    Case "string", "varchar"
                        cmd.Parameters.Add(sParamName, MySqlDbType.VarChar, 200).Value = sDataValue
                    Case "integer"
                        cmd.Parameters.Add(sParamName, MySqlDbType.Int32).Value = Convert.ToInt32(sDataValue)
                    Case "double"
                        cmd.Parameters.Add(sParamName, MySqlDbType.Double).Value = Convert.ToDouble(sDataValue)
                    Case "datetime"
                        cmd.Parameters.Add(sParamName, MySqlDbType.DateTime).Value = Convert.ToDateTime(sDataValue)
                End Select
            Next lCtr
        End If
    End If
    cmd.ExecuteNonQuery()
    conn.Close()
    InsertUpdateData = True
    Exit Function
Catch ex As MySqlException
    MessageBox.Show(ex.Message)
End Try

内容的提问来源于stack exchange,提问作者user15404864

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:21:03