如何在 c# 实体框架核心中使用 FromSqlRaw() 将 OUTPUT 参数发送到 MySql 存储过程

Posted

技术标签:

【中文标题】如何在 c# 实体框架核心中使用 FromSqlRaw() 将 OUTPUT 参数发送到 MySql 存储过程【英文标题】:How send OUTPUT parameter to MySql stored procedure using FromSqlRaw() in c# entity framework core 【发布时间】:2021-10-07 22:27:51 【问题描述】:

在 Visual Studio Code C# 项目中,我使用的是 Microsoft.EntityFrameworkCore 5.0.8 和 mysql.EntityFrameworkCore 5.0.5。

我需要使用 FromSqlRaw() 调用带有输出参数的 Mysql 存储过程并接收 MySqlException: “例程 ID_SP_Clientes_Validar 的 OUT 或 INOUT 参数 2 不是 BEFORE 触发器中的变量或 NEW 伪变量”

如果我使用 ADO.NET 可以解决问题,但我不想使用 CommandText

存储过程:

CREATE PROCEDURE `ID_SP_Clientes_Validar`(IN `cliente` decimal(6,0), OUT `mensaje_alta` TINYTEXT)

BEGIN
    SELECT * FROM id_clientes WHERE clnumero = cliente;
    SET mensaje_alta = 'Cliente Valido.';
END

C#代码:

var arParams = new[] 
new MySqlParameter("@cliente", MySqlDbType.Decimal)
            
                Direction = ParameterDirection.Input,
                Value = clienteId
            ,
            new MySqlParameter("@mensaje_alta", MySqlDbType.TinyText )
            
                Direction = ParameterDirection.Output,
                Value = ""
            
        ;

var cliente = await context.miCliente.FromSqlRaw<ClienteGet>("CALL D_SP_Clientes_Validar(@cliente,@mensaje_alta)",arParams).ToListAsync();

请帮帮我!!!

提前致谢

【问题讨论】:

我相信this link 可能会有所帮助。 感谢@AliK 的消息,但在示例中,您向我展示了他们使用 SQL(我需要 MySql)。反正我已经试过了但是MySql不支持参数旁边的“OUTPUT”字样 在 mysql 中是 OUT 而不是 OUTPUT 所以参数看起来像 OUT total INT 例如。 应该是"CALL D_SP_Clientes_Validar(@cliente,@mensaje_alta)"@mensaje_alta 之前? 我在转录代码时出错了。在我使用@mensaje_alta 的程序代码中。谢谢 【参考方案1】:

使用 MySQL 时,EF Core 不支持此功能。

根本问题是 FromSqlRaw 使用 CommandType.Text 但 MySQL 的 ADO.NET 提供程序无法从文本命令(MySql.Data bug、MySqlConnector bug)返回输出参数,这主要是由于 MySQL 的限制协议。

在这些问题上有更多的讨论:

FromSqlRaw() and ParameterDirection.Output - efcore Parameter direction not supported in CommandType.Text - MySqlConnector

【讨论】:

以上是关于如何在 c# 实体框架核心中使用 FromSqlRaw() 将 OUTPUT 参数发送到 MySql 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个变量中存储多行? C# 实体框架

如何使用 C# 代码部分中的 SQL 函数使用 MVC 4 中的实体框架

核心数据编码模式

如何刷新实体框架核心 DBContext?

如何通过实体框架从 C# 中的同步代码并行运行查询

如何在没有实体框架提供程序的情况下在 .net 核心中实现谷歌登录