如何调用带参数的 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很好。