在一个面向.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语句,以返回标量值作为输出或结果参数?
1条答案
按热度按时间mkshixfv1#
可以使用上下文来获取ConnectionString并创建一个新的DB2Connection
没有必要这样做。要将ADO.NET直接与DbContext一起使用,只需执行以下操作: