在我的项目中,我有一个从Sql2005 Server检索数据的功能 像这样,
SqlConnection sqlCnn = new SqlConnection("");
SqlCommand sqlCmd = new SqlCommand("Select user_id from users");
SqlDataReader sqlReader = null;
sqlCnn.Open();
sqlCmd.Connection = sqlCnn;
sqlReader = sqlCmd.ExecuteReader();
if (sqlReader.HasRows)
{
while (sqlReader.Read())
{
if(user_id == 1)
{
SqlCommand sqlCmd2 = new SqlCommand("Select mobile from tbl");
sqlCmd2.Connection = sqlCnn;
sqlCmd2.ExecuteReader();
}
}
}
执行sqlcmd2时出现以下错误。
已经有一个开放的DataReader 与此命令相关联 必须先关闭。
我不想在那里创建一个新的sqlconnection。有什么方法可以解决 这个问题?
答案 0 :(得分:3)
要为每个连接打开两个阅读器,您需要启用MARS(多个活动结果集)。 您可以通过连接字符串执行此操作:
Server=myServerAddress;Database=myDataBase;Trusted_Connection=True; MultipleActiveResultSets=true;
但是,不建议采用这种方法 我确信您可以通过一个查询检索所需的数据。
如果您需要,您需要解释需要检索的内容,并提供单个查询的建议 我认为你展示的代码只是一个样本,而不是一个真实的代码,因为它没有多大意义。
看看'MARS是一个好消息,还是有任何不利因素?'第here.部分
答案 1 :(得分:3)
解决此问题的最佳方法是在数据库中将两个表连接在一起。这应该会给你至少一个数量级的性能提升,特别是如果在适当的列上有一个索引。
数据结构不会进入此状态;这就是你如何订购结果以及如何阅读它们的全部内容。如果操作正确,您可以将其读入任何可以想象的数据结构中。
但是,如果这不是一个选项,请确保您至少使用Sql Server 2005并将MultipleActiveResultSets=true
添加到您的连接字符串。
当您使用它时,您的现有代码会被破坏并最终导致您的数据库不可用,因为在发生异常的情况下您无法保证关闭您的连接。要解决此问题,请在using
块中创建SqlConnection对象。
答案 2 :(得分:1)
如果您不能创建第二个SQL连接,则可以启用MARS(多个活动结果集)。
为什么不想要第二次连接?
答案 3 :(得分:0)
在.net 4中,你不需要检查hasrows条件。 Reader.Read()方法根据表内容返回true / false。刚用空表检查。工作!