我不断收到此错误:"无效试图调用读时,读者可闭合QUOT; [英] I keep getting this error: "Invalid attempt to call Read when reader is closed"
本文介绍了我不断收到此错误:"无效试图调用读时,读者可闭合QUOT;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
下面是我的code,我关闭和打开阅读器,它仍然没有工作。几个线程可以同时访问这个功能,但有一个锁。它的工作原理几次在开始的时候,但我迟早得异常无效试图调用读时读取器已关闭在
Here is my code, I close and open the reader and it's still not working. A few threads can access this function concurrently but there is a lock. It works a few times in the beginning but sooner or later I get the exception 'Invalid attempt to call Read when reader is closed' at
private IList<BursaUser> GetUsers(SqlCommand cmd)
{
IList<User> users = new List<User>();
User user;
lock (thisLock)
{
SqlDataReader dr = null;
try
{
Conn.Open();
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (dr.Read())
{
user = new User
{
UserId = Convert.ToInt32(dr["WorkerNum"]),
CompanyName = dr["CompanyName"].ToString(),
WorkerName = dr["WorkerFirstName"] + " " + dr["WorkerFamilyName"],
Phone = dr["Phone"].ToString()
};
if (dr["QueueNum"] != null && dr["QueueNum"] != DBNull.Value)
{
user.Queue = new Queue
{
HasAlreadyEntered =
dr["flgAppear"] != null && dr["flgAppear"].ToString() == "Y",
IsFromWebsite = dr["TookFrom"].ToString() == "1",
IsMelutash = dr["IsMelutash"].ToString() == "1",
TimeOrdered = DateTime.Parse(dr["DateTime1"].ToString()),
QueueNum = Convert.ToInt32(dr["QueueNum"]),
SMS = dr["SMSCode"].ToString()
};
}
users.Add(user);
}
}
catch (Exception e)
{
throw e;
}
finally
{
if (dr != null)
{
dr.Close();
dr.Dispose();
}
}
return users;
}
}
怎么办?
推荐答案
让我们尝试改善这一codeA一点:
Let's try to improve this code a little:
private IEnumerable<BursaUser> GetUsers()
{
using (var conn = new SqlConnection(SomeConnectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT WorkerNum, CompanyName, ... FROM Users";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var user = new User
{
UserId = reader.GetInt32(reader.GetOrdinal("WorkerNum")),
CompanyName = reader.GetString(reader.GetOrdinal("CompanyName")),
// TODO: complete other fields
};
// TODO: do the tests and complete the complex properties
yield return user;
}
}
}
}
现在这个code是完全可重入和线程安全的。你不需要任何锁定。
Now this code is perfectly reentrant and thread safe. You don't need any locking.
这篇关于我不断收到此错误:&QUOT;无效试图调用读时,读者可闭合QUOT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文