【问题标题】:How to Select an out parameter from a MySql Procedure in .net如何从 .net 中的 MySql 过程中选择输出参数
【发布时间】:2020-08-20 03:10:59
【问题描述】:

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

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:必须定义参数'@destValue'”

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

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

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

【问题讨论】:

  • 感谢您提供了一个写得很好的问题陈述和一个最小的可重复示例!

标签: c# mysql .net-core mysqlcommand


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2010-12-10
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多