0

我想使用实体框架从存储过程中获取多个结果集。表的结果成功获得,但是当我想获得一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
                };
    }
}

这是我要返回的模型

在此处输入图像描述

这是我的存储过程结果:

在此处输入图像描述

4

1 回答 1

2

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

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

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

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

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

最后,作为一个建议,用语句包装你的ConnectionReader对象,using以便在你的执行结束时,它们被释放,而不是留下打开的连接,这最终会导致所有池连接都在使用异常。

于 2020-05-16T17:38:48.973 回答