如何调用带参数的 MySQL 过程?
How do you call a MySQL procedure with parameters?
我试图在单击 winform 中的按钮时调用存储过程。存储过程有一个插入语句,其中值 boardID = @newGameID
.
newGameID
引用在我的 c# 代码中传入的值。作为测试,我将该值设置为 1。这是我的存储过程:
delimiter //
create procedure loopData()
BEGIN
DECLARE i int DEFAULT 0;
WHILE i <= 62 DO
INSERT INTO tbl_tile (boardID) VALUES(@newGameID);
SET i = i + 1;
END WHILE;
END//
delimiter ;
这是链接到按钮的我的 C# 代码:
private void Tile()
{
var connectionString = "server=localhost;password=1234;user id=root;persistsecurityinfo=True;database=dat602_assessmentdb_m2";
using (var connection = new MySqlConnection(connectionString))
{
MySqlCommand command = new MySqlCommand("loopData", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("newGameID", 1);
command.Connection.Open();
var result = command.ExecuteNonQuery();
command.Connection.Close();
}
}
当我 运行 winform 时,我得到这个错误:
我不确定我的结构是否正确,但我认为当我这样做时 command.Parameters.AddWithValue("newGameID", 1)
,它会将存储过程中的参数值设置为 1。我该如何解决这个问题还是有更好的方法来解决这个问题?
试试这个:
command.Parameters.AddWithValue("@newGameID", 1)
试试这个方法,如果你得到同样的错误,检查你的 SP
string Conn = "server=localhost;password=1234;user id=root;persistsecurityinfo=True;database=dat602_assessmentdb_m2"
SqlConnection con = new SqlConnection(Conn);
try
{
SqlCommand com = new SqlCommand("loopData", con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@newGameID", 1);
con.Open();
com.ExecuteNonQuery();
}
问题是您调用的 sql 存储过程没有任何参数!存储过程确实在其主体中引用了 会话变量 ,但这不是您传递的 sql 语句的一部分。
您应该将存储过程更改为具有参数,然后您可以按照您的方式传递它:
delimiter //
create procedure loopData(IN newGameID int)
BEGIN
DECLARE i int DEFAULT 0;
WHILE i <= 62 DO
INSERT INTO tbl_tile (boardID) VALUES(newGameID);
SET i = i + 1;
END WHILE;
END//
delimiter ;
您现在可以使用 C# 代码将参数传递给存储过程。
警告:我的解决方案仅修复问题中的错误消息!存储过程的主体对我来说意义不大,因为它试图将传递的值插入 tbl_title table 63 次。如果该字段如其名称所示是主键,则无论何时调用该存储过程,都会出现重复键错误。解决这个问题超出了这个问题的范围,因为没有关于它应该如何工作的信息,而且问题不是关于重复键错误。
这对某人有帮助。
MySQL 程序:
CREATE PROCEDURE `bestSellingProducts`(IN startDate DATETIME, IN endDate DATETIME, IN nTop INT)
BEGIN
SELECT p.product_id, p.product_name, p.price
FROM orders o
INNER JOIN order_items oi ON oi.order_id = o.order_id
INNER JOIN products p ON p.product_id=oi.product_id
WHERE (o.order_date BETWEEN startDate AND endDate)
GROUP BY p.product_id
ORDER BY quantitySold DESC
LIMIT nTop;
END
现在如何使用C#/VB
command.CommandText = "dbname.bestSellingProducts"
command.Parameters.AddWithValue("@startDate", fromDate)
command.Parameters.AddWithValue("@endDate", toDate)
command.Parameters.AddWithValue("@nTop", 10)
command.CommandType = CommandType.StoredProcedure
注释。
对于此示例, fromDate 和 toDate 是 DateTime 类型。
打开连接时使用Try/Catch很好。
我试图在单击 winform 中的按钮时调用存储过程。存储过程有一个插入语句,其中值 boardID = @newGameID
.
newGameID
引用在我的 c# 代码中传入的值。作为测试,我将该值设置为 1。这是我的存储过程:
delimiter //
create procedure loopData()
BEGIN
DECLARE i int DEFAULT 0;
WHILE i <= 62 DO
INSERT INTO tbl_tile (boardID) VALUES(@newGameID);
SET i = i + 1;
END WHILE;
END//
delimiter ;
这是链接到按钮的我的 C# 代码:
private void Tile()
{
var connectionString = "server=localhost;password=1234;user id=root;persistsecurityinfo=True;database=dat602_assessmentdb_m2";
using (var connection = new MySqlConnection(connectionString))
{
MySqlCommand command = new MySqlCommand("loopData", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("newGameID", 1);
command.Connection.Open();
var result = command.ExecuteNonQuery();
command.Connection.Close();
}
}
当我 运行 winform 时,我得到这个错误:
我不确定我的结构是否正确,但我认为当我这样做时 command.Parameters.AddWithValue("newGameID", 1)
,它会将存储过程中的参数值设置为 1。我该如何解决这个问题还是有更好的方法来解决这个问题?
试试这个:
command.Parameters.AddWithValue("@newGameID", 1)
试试这个方法,如果你得到同样的错误,检查你的 SP
string Conn = "server=localhost;password=1234;user id=root;persistsecurityinfo=True;database=dat602_assessmentdb_m2"
SqlConnection con = new SqlConnection(Conn);
try
{
SqlCommand com = new SqlCommand("loopData", con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@newGameID", 1);
con.Open();
com.ExecuteNonQuery();
}
问题是您调用的 sql 存储过程没有任何参数!存储过程确实在其主体中引用了 会话变量 ,但这不是您传递的 sql 语句的一部分。
您应该将存储过程更改为具有参数,然后您可以按照您的方式传递它:
delimiter //
create procedure loopData(IN newGameID int)
BEGIN
DECLARE i int DEFAULT 0;
WHILE i <= 62 DO
INSERT INTO tbl_tile (boardID) VALUES(newGameID);
SET i = i + 1;
END WHILE;
END//
delimiter ;
您现在可以使用 C# 代码将参数传递给存储过程。
警告:我的解决方案仅修复问题中的错误消息!存储过程的主体对我来说意义不大,因为它试图将传递的值插入 tbl_title table 63 次。如果该字段如其名称所示是主键,则无论何时调用该存储过程,都会出现重复键错误。解决这个问题超出了这个问题的范围,因为没有关于它应该如何工作的信息,而且问题不是关于重复键错误。
这对某人有帮助。
MySQL 程序:
CREATE PROCEDURE `bestSellingProducts`(IN startDate DATETIME, IN endDate DATETIME, IN nTop INT)
BEGIN
SELECT p.product_id, p.product_name, p.price
FROM orders o
INNER JOIN order_items oi ON oi.order_id = o.order_id
INNER JOIN products p ON p.product_id=oi.product_id
WHERE (o.order_date BETWEEN startDate AND endDate)
GROUP BY p.product_id
ORDER BY quantitySold DESC
LIMIT nTop;
END
现在如何使用C#/VB
command.CommandText = "dbname.bestSellingProducts"
command.Parameters.AddWithValue("@startDate", fromDate)
command.Parameters.AddWithValue("@endDate", toDate)
command.Parameters.AddWithValue("@nTop", 10)
command.CommandType = CommandType.StoredProcedure
注释。 对于此示例, fromDate 和 toDate 是 DateTime 类型。 打开连接时使用Try/Catch很好。