【发布时间】:2021-09-02 13:39:25
【问题描述】:
在面向 .NET 5.0 的 EntityFramework Core 类库中,我可以使用以下代码从使用 EF Core for SQL Server 的参数化 SQL 语句返回标量值:
public object GetResult()
{
var context = _contextFactory.CreateDbContext();
var commandText = "SELECT @p0 = (SELECT Case When Exists(SELECT null WHERE @p1 != 'B') THEN 1 Else 0 End)";
var p0 = new SqlParameter
{
ParameterName = "@p0",
SqlDbType = SqlDbType.Bit,
Direction = ParameterDirection.Output,
};
var p1 = new SqlParameter
{
ParameterName = "@p1",
SqlDbType = SqlDbType.VarChar,
Size = 1,
Direction = ParameterDirection.Input,
Value = 'A'
};
_ = context.Database.ExecuteSqlRaw(commandText, new[] { p0, p1 });
return p0.Value;
}
我希望能够使用 EF Core for DB2 做类似的事情。 我正在使用 IBM.EntityFrameworkCore 5.0.0.300 Nuget 包。 DB2 EF Core 提供程序不支持命名参数,因此必须将参数名称替换为 ?命令字符串中的标记...但是,DB2 不支持此语句并引发错误。
public object GetResult()
{
var context = _contextFactory.CreateDbContext();
var commandText = "SELECT ? = (SELECT Case When Exists(SELECT 1 FROM sysibm.sysdummy1 WHERE ? != 'R') THEN 1 Else 0 End FROM sysibm.sysdummy1)";
var p0 = new DB2Parameter
{
ParameterName = "@p0",
SqlDbType = DB2Type.Boolean,
Direction = ParameterDirection.Output,
};
var p1 = new DB2Parameter
{
ParameterName = "@p1",
SqlDbType = DB2Type.VarChar,
Size = 1,
Direction = ParameterDirection.Input,
Value = 'A'
};
_ = context.Database.ExecuteSqlRaw(commandText, new[] { p0, p1 });
return p0.Value;
}
我可以使用上下文来获取 ConnectionString 并创建一个新的 DB2Connection 和一个参数化的 DB2Command 并调用 ExecuteScalar 来获取结果,但我想尝试将值作为强类型参数返回,而不是返回值的 ExecuteScalar作为一个对象。
有谁知道我如何使用 EF Core 和 ExecuteSqlRaw 为 DB2 制作一个 SQL 语句以返回一个标量值作为输出或结果参数??
【问题讨论】:
标签: c# entity-framework db2 output-parameter command-text