【问题标题】:Return scalar value from parameterized SQL statement using DB2 EF Core使用 DB2 EF Core 从参数化 SQL 语句返回标量值
【发布时间】: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


    【解决方案1】:

    可以使用上下文获取 ConnectionString 并创建一个新的 DB2Connection

    没有必要这样做。要直接将 ADO.NET 与您的 DbContext 一起使用,只需执行以下操作:

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

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 2020-10-17
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2021-03-26
      • 2021-03-04
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多