【问题标题】:Get multiple result set with stored procedure using Entity Framework calculated column使用 Entity Framework 计算列通过存储过程获取多个结果集
【发布时间】:2020-05-16 15:30:56
【问题描述】:

我想使用实体框架从存储过程中获取多个结果集。表格结果成功,但是当我想获得Balance 列时,它不能,任何帮助将不胜感激。

谢谢

public ViewModel GetTwoResultSetsForUserId(string Date, string FromDate, string ToDate, int userId)
{
    using (var db = new CuumiEntities())
    {
        // Create a SQL command and add parameter
        var cmd = db.Database.Connection.CreateCommand();
        cmd.CommandText = "getTransactionDatewisetesting";
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add(new SqlParameter("@Date", Date));
        cmd.Parameters.Add(new SqlParameter("@FromDate", FromDate));
        cmd.Parameters.Add(new SqlParameter("@ToDate", ToDate));
        cmd.Parameters.Add(new SqlParameter("@UserId", userId));

        // execute your command
        db.Database.Connection.Open();
        var reader = cmd.ExecuteReader();
        double Balance = reader.GetDouble(0);

        var transactions = ((IObjectContextAdapter)db)
                                .ObjectContext
                                .Translate<transaction>(reader)
                                .ToList();

        reader.NextResult();

        var Expenses = ((IObjectContextAdapter)db)
                        .ObjectContext
                        .Translate<spendingClass>(reader, "spendings", MergeOption.AppendOnly).ToList();

        var balance = ((IObjectContextAdapter)db).ObjectContext.Translate<PrevBalance>(reader);

        return new ViewModel
               {
                   transactions = transactions,
                   Expenses = Expenses,
                   Balance = Balance
                };
    }
}

这是我想要返回的模型

这是我的存储过程结果:

【问题讨论】:

  • 请分享您遇到的错误,这样我们为您提供帮助会容易得多。我猜你在double Balance = reader.GetDouble(0); 线上遇到了错误。您错过了在获取数据之前读取数据。尝试将您的代码添加为if (reader.Read()) { var Balance = reader.GetDecimal(0); }。
  • @Nazim 我在这一行收到以下错误指定的强制转换在 sql server 中无效,它的类型是 decial,我在这里是双倍的
  • SQL 和 C# 端的类型不同。在您的情况下,如果您想将 Balance 读取为 double 类型,请对您的存储过程执行此更新以将 Balance 作为 FLOAT SQL 类型返回。您可以执行SELECT CAST(Balance AS FLOAT) 之类的操作,然后您可以使用GetDouble(0) 读取结果。或者,如果是十进制或双倍无关紧要,只更改您的代码,而不是 GetDouble(0) 使用 GetDecimal(0)。
  • @Nazim 谢谢。问题已解决。

标签: c# sql-server entity-framework stored-procedures multiple-resultsets


【解决方案1】:

SQL Server 和 .NET Framework 基于不同的类型系统,这就是为什么在 .NET 端读取数据时需要谨慎使用数据映射。

在这里您可以找到 SQL Server 和 .NET Framework https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings之间的类型映射或类型等效项的列表@

在您的问题中,不清楚 SQL 端的 Balance 列的类型或来自您的存储过程的类型。在您的代码中,您尝试将Balance 列读取为Double,这就是您获得Specified cast is not valid in sql server 的位置。根据微软的文档(上面共享的链接),声明列类型在 SQL Server 端必须为Float,以便在.NET 端您可以将其读取为Double 类型。

当您收到类型转换错误时,我猜您正在从数据库返回非 Float 值。作为一种解决方案,您可以更新存储过程以将 Balance 转换为 Float 类型。

示例用法:SELECT CAST(Balance AS FLOAT)

最后,作为一个建议,用using 语句包装您的Connection 和Reader 对象,以便在执行结束时将它们处理掉,而不是留下打开的连接,这最终会导致所有池连接正在使用异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多