2

假设我们有一个像这样的存储过程

CREATE PROCEDURE CopyValue(IN src INT, OUT dest INT)
BEGIN
    SET dest = src;
END

我想从 .net 应用程序调用它(假设连接等已成功创建)

var sql = "call CopyValue(100, @destValue); select @destValue as Results;";

上述语句中的字符串在 MySql Workbench 中调用时效果很好。

MySqlCommand但是,当在.net 中的对象上执行时,这 - 显然 - 失败并出现“MySqlException:必须定义参数'@destValue'”

如何安排此语句,以便从现有过程中捕获输出参数?

注意:我正在运行 MySql 5.6,目前无法升级。

NB直接调用该程序CommandType.StoredProcedure违反了公司准则。

4

2 回答 2

1

默认情况下,MySQL Connector/NET 不允许在 SQL 语句中使用用户定义的变量。AllowUserVariables=true;您可以通过添加到您的连接字符串来放宽此限制。无需修改您的 SQL 或您的执行MySqlCommand方式。

有关为什么这是默认设置的信息,您可以阅读有关此MySqlConnector问题的研究(该问题也具有相同的默认行为,但会有更好的错误消息告诉您如何解决该问题):https://github。 com/mysql-net/MySqlConnector/issues/194

于 2020-05-06T00:15:20.657 回答
1

一位同事(希望保持匿名)完美地回答了这个问题。基本上把反引号`放在@之后和变量名的末尾,例如

@`MyParam`

一个完整的工作示例。

static void Main(string[] args)
{
    using var con = new MySql.Data.MySqlClient.MySqlConnection("Data Source=localhost; User Id=...;Password=...;Initial Catalog=...");
    con.Open();
    using var cmd = con.CreateCommand();
    cmd.CommandText = "call CopyValue2(100, @`v2`); select @`v2` as Results;";
    using var reader = cmd.ExecuteReader();
    if (reader.Read())
        Console.WriteLine($"Copied Value {reader.GetInt64(0)}");
}

谢谢OG :)

于 2020-05-11T08:05:11.693 回答