如何从 .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 :)
假设我们有一个这样的存储过程
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 :)