使用DB2 EF Core从参数化SQL语句返回标量值

5lwkijsr  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(145)

在一个面向.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语句,以返回标量值作为输出或结果参数?

mkshixfv

mkshixfv1#

可以使用上下文来获取ConnectionString并创建一个新的DB2Connection
没有必要这样做。要将ADO.NET直接与DbContext一起使用,只需执行以下操作:

var con = context.Database.GetDbConnection();
con.Open();
. . .

相关问题