java datareader大小,已经有与此命令关联的打开的DataReader,必须首先关闭

博客内容讨论了在使用Entity Framework进行数据查询时遇到的一个常见错误:'已经有一个与此命令相关联的打开的DataReader,必须先关闭它'。作者提供了几种解决方案,包括使用ToList()方法来解决此问题,以及考虑使用Include()优化查询性能。此外,还提到了修改数据库连接字符串以允许多个活动结果集的可能性。
摘要由CSDN通过智能技术生成

我有此查询,并且出现此函数错误:

var accounts = from account in context.Accounts

from guranteer in account.Gurantors

select new AccountsReport

{

CreditRegistryId = account.CreditRegistryId,

AccountNumber = account.AccountNo,

DateOpened = account.DateOpened,

};

return accounts.AsEnumerable()

.Select((account, index) => new AccountsReport()

{

RecordNumber = FormattedRowNumber(account, index + 1),

CreditRegistryId = account.CreditRegistryId,

DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),

AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)

})

.OrderBy(c=>c.FormattedRecordNumber)

.ThenByDescending(c => c.StateChangeDate);

public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)

{

return (from h in context.AccountHistory

where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo

select h.LastUpdated).Max();

}

错误是:

已经有一个与此命令相关联的打开的DataReader,必须先关闭它。

更新:

堆栈跟踪已添加:

InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.]

System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) +5008639

System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +23

System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144

System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87

System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32

System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141

System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12

System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10

System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443

[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.]

System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479

System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +683

System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +119

System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() +38

System.Linq.Enumerable.Single(IEnumerable`1 source) +114

System.Data.Objects.ELinq.ObjectQueryProvider.b__3(IEnumerable`1 sequence) +4

System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +29

System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +91

System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +69

System.Linq.Queryable.Max(IQueryable`1 source) +216

CreditRegistry.Repositories.CreditRegistryRepository.DateLastUpdated(Int64 creditorRegistryId, String accountNo) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1497

CreditRegistry.Repositories.CreditRegistryRepository.b__88(AccountsReport account, Int32 index) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1250

System.Linq.d__7`2.MoveNext() +198

System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217

System.Linq.d__0.MoveNext() +96

#1楼

您可以在return语句之前使用ToList()方法。

var accounts =

from account in context.Accounts

from guranteer in account.Gurantors

select new AccountsReport

{

CreditRegistryId = account.CreditRegistryId,

AccountNumber = account.AccountNo,

DateOpened = account.DateOpened,

};

return accounts.AsEnumerable()

.Select((account, index) => new AccountsReport()

{

RecordNumber = FormattedRowNumber(account, index + 1),

CreditRegistryId = account.CreditRegistryId,

DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber),

AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber)}).OrderBy(c=>c.FormattedRecordNumber).ThenByDescending(c => c.StateChangeDate).ToList();

public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)

{

var dateReported = (from h in context.AccountHistory

where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo

select h.LastUpdated).Max();

return dateReported;

}

#2楼

在我的情况下,使用Include()解决了该错误,并且根据情况,如果可以通过联接同时查询所有查询,则发出多个查询的效率要高得多。

IEnumerable users = db.Users.Include("Projects.Tasks.Messages");

foreach (User user in users)

{

Console.WriteLine(user.Name);

foreach (Project project in user.Projects)

{

Console.WriteLine("\t"+project.Name);

foreach (Task task in project.Tasks)

{

Console.WriteLine("\t\t" + task.Subject);

foreach (Message message in task.Messages)

{

Console.WriteLine("\t\t\t" + message.Text);

}

}

}

}

#3楼

我不知道这是否是重复的答案。 如果是这样,我很抱歉。 我只想让有需要的人知道如何使用ToList()解决问题。

就我而言,下面的查询有相同的异常。

int id = adjustmentContext.InformationRequestOrderLinks.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).Max(item => item.Id);

我像下面一样解决了

List links = adjustmentContext.InformationRequestOrderLinks

.Where(item => item.OrderNumber == irOrderLinkVO.OrderNumber && item.InformationRequestId == irOrderLinkVO.InformationRequestId).ToList();

int id = 0;

if (links.Any())

{

id = links.Max(x => x.Id);

}

if (id == 0)

{

//do something here

}

#4楼

除了Ladislav Mrnka的答案:

如果要在“设置”选项卡上发布和覆盖容器,则可以将MultipleActiveResultSet设置为True。 您可以通过单击“ 高级...”找到此选项,它将位于“ 高级”组下。

#5楼

这是需要参考的人的有效连接字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值