来自 C# 的 PROCEDURE... 的参数数量不正确

Posted

技术标签:

【中文标题】来自 C# 的 PROCEDURE... 的参数数量不正确【英文标题】:Incorrect number of arguments for PROCEDURE... from C# 【发布时间】:2021-01-15 11:54:14 【问题描述】:

我在存储过程中使用参数时遇到问题。我相信我没有使用 C# 正确传递参数。

我的代码大致相当于:

public static string GetCustomer(string storedProcedure, string connectionString)

    DataTable dt = new DataTable();
    using (mysqlConnection con = new MySqlConnection(connectionString))
    
        using (MySqlCommand cmd = new MySqlCommand(storedProcedure, con))
        
            cmd.Parameters.AddWithValue("_table1", "table1");
            cmd.Parameters.AddWithValue("_table2", "table2");

            con.Open();
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            IDataParameter[] temp = da.GetFillParameters();//returns 2 parameters
            da.Fill(dt);//Breaks here with the error below

            //Irrelevant code
        
    
    return "";

PROCEDURE tspos.get_customer 的参数数量不正确;预期 2,得到 0

DROP PROCEDURE IF EXISTS get_customer;
DELIMITER //
CREATE PROCEDURE get_customer
(
    IN _table1 VARCHAR(25),
    IN _table2 VARCHAR(25)
)
BEGIN
SET @t1 = CONCAT('SELECT a.*, b.* FROM ', _table1, ' a, ', _table2, ' b');
    PREPARE statement FROM @t1;
    EXECUTE statement;
    DEALLOCATE PREPARE statement;
END //

DELIMITER ;

下面的调用按预期工作,所以我想我的问题出在 C# 中

CALL get_customer('table1', 'table2');
CALL get_customer('table3', 'table4');

【问题讨论】:

【参考方案1】:

既然你用过MySqlDataAdapter,最好用SqlDataAdapter.SelectCommand Property来指定参数,另外别忘了你需要在参数名称前加一个@,像这样:

da.SelectCommand.Parameters.AddWithValue("@_table1", "table1");

虽然直接指定类型,使用Value属性比AddWithValue好。

Can we stop using AddWithValue() already?

另外一点,您需要使用如下代码指定要存储过程的命令类型:

cmd.CommandType = CommandType.StoredProcedure;

【讨论】:

【参考方案2】:

我认为您的参数名称应以@ 符号为前缀:

cmd.Parameters.AddWithValue("@_table1", "table1");
cmd.Parameters.AddWithValue("@_table2", "table2");

另外,请确保正确设置命令类型:

using (MySqlConnection con = new MySqlConnection(connectionString))

    using (MySqlCommand cmd = new MySqlCommand(storedProcedure, con))
    
        //Set command type
        cmd.CommandType = CommandType.StoredProcedure;
        con.Open();
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        
        cmd.Parameters.AddWithValue("@_table1", "table1");
        cmd.Parameters.AddWithValue("@_table2", "table2");
        
        IDataParameter[] temp = da.GetFillParameters();//returns 2 parameters
        da.Fill(dt);

        //Irrelevant code
    

【讨论】:

不幸的是,这并没有解决问题。同样的错误。 @EricWarburton:da.GetFillParameters 方法有什么作用? 从 DbDataAdapter 中说: 摘要:获取用户在执行 SQL SELECT 语句时设置的参数。我用它只是为了检查我的参数是否在 da 中设置。 @EricWarburton:抱歉,我看错了适配器的名称 (da)。我认为这是此方法范围之外的其他类。我想知道调用它是否会清除您的参数...我更新了答案,所以尝试一下,看看会发生什么。 @EricWarburton:我现在几乎 100% 确定您的问题是 @ 标志以及未设置的命令类型。请检查我的答案。

以上是关于来自 C# 的 PROCEDURE... 的参数数量不正确的主要内容,如果未能解决你的问题,请参考以下文章

php mysqi bind_param 变量数与准备好的语句中的参数数不匹配[重复]

call_user_func_array() - 警告:mysqli_stmt::bind_param():变量数与准备语句中的参数数不匹配

来自 C# 的 PROCEDURE... 的参数数量不正确

unity 3d-大分数数字变成指数 C# [关闭]

如何使用来自 c# 的 MySQL 存储过程将表作为输入发送到存储过程?我有 T-SQL 工作

c# 执行调用Oracle Procedure传参及回传值