【发布时间】:2021-07-30 14:41:07
【问题描述】:
我在 foreach 循环中执行存储过程时遇到问题,这是我的代码:
var members = await _context.Members
.Where(x => !x.Deleted)
.ToListAsync(cancellationToken);
using (SqlConnection con = new SqlConnection("server=localhost;database=ProductsDb;User=user;Password=password"))
{
using (SqlCommand cmd = new SqlCommand("CalculateRolesForEachMember", con))
{
cmd.CommandType = CommandType.StoredProcedure;
// open connection ProductsDb database
con.Open();
foreach (var member in members)
{
cmd.Parameters.Add("@memberId", SqlDbType.UniqueIdentifier).Value = member.Id;
cmd.Parameters.Add("@month", SqlDbType.Int).Value = (int)month;
cmd.Parameters.Add("@year", SqlDbType.Int).Value = (int)year;
SqlDataReader reader = cmd.ExecuteReader(); // ON SECOND ITERATION OF FOREACH CODE BREAKS HERE
while (reader.Read())
{
member.MemberType = memberTypes.FirstOrDefault(x => x.Acronym == reader["Role"].ToString());
member.ModifiedDate = DateTime.Now;
}
cmd.Parameters.Clear();
}
await _context.SaveChangesAsync(cancellationToken);
}
}
这是我的例外:
System.InvalidOperationException: 已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭。
在 Microsoft.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand 命令)
如何在不引入数据表的情况下使用此代码解决/修复此问题?
【问题讨论】:
-
也许你应该在你的代码中添加
reader.Close()... -
为什么你同时拥有
ExecuteNonQuery()和ExecuteReader()?这基本上只执行每个存储过程 两次 - 一次而不期望返回结果集(对于INSERT、DELETE或UPDATE来说可以),第二次返回结果集。 .....这没什么用..... -
@marc_s 它在我试验后就离开了,即使我删除了 cmd.ExecuteNonQuery();我仍然收到同样的错误..
-
@marc_s 检查我的更新伙伴,即使我删除了未使用的代码并应用了下面 cmets 中的一些代码,它仍然会中断。
标签: c# sql-server stored-procedures .net-core