PROCEDURE 的参数数量不正确...来自 C#
Incorrect number of arguments for PROCEDURE... from C#
我在存储过程中使用参数时遇到问题。我相信我没有使用 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');
我认为您的参数名称应该以 @
符号为前缀:
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
}
}
既然用了MySqlDataAdapter
,最好用SqlDataAdapter.SelectCommand Property
来指定参数,也别忘了在前面加一个@
参数名称,类似这样:
da.SelectCommand.Parameters.AddWithValue("@_table1", "table1");
尽管直接指定类型并使用值 属性 比 AddWithValue
更好。
Can we stop using AddWithValue() already?
另外一点,您需要使用如下代码指定要存储过程的命令类型:
cmd.CommandType = CommandType.StoredProcedure;
我在存储过程中使用参数时遇到问题。我相信我没有使用 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');
我认为您的参数名称应该以 @
符号为前缀:
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
}
}
既然用了MySqlDataAdapter
,最好用SqlDataAdapter.SelectCommand Property
来指定参数,也别忘了在前面加一个@
参数名称,类似这样:
da.SelectCommand.Parameters.AddWithValue("@_table1", "table1");
尽管直接指定类型并使用值 属性 比 AddWithValue
更好。
Can we stop using AddWithValue() already?
另外一点,您需要使用如下代码指定要存储过程的命令类型:
cmd.CommandType = CommandType.StoredProcedure;