如何在 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 存储过程的主要内容,如果未能解决你的问题,请参考以下文章