如何从 .net 中的 MySql 过程 Select 输出参数

How to Select an out parameter from a MySql Procedure in .net

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

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.

中调用时效果很好

然而,当在 .net

中的 MySqlCommand 对象上执行时,这显然失败并显示 "MySqlException: Parameter '@destValue' must be defined"

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

注意:我运行反对MySql 5.6,我现在不能升级。

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

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

有关为什么这是默认值的信息,您可以阅读关于此MySqlConnector issue (which also has the same default behaviour, but a much better error message that will tell you how to solve the problem): https://github.com/mysql-net/MySqlConnector/issues/194

的研究

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

@`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 :)