【发布时间】: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