![](/img/trans.png)
[英]Is there a way to have a SqlConnection that will write while an associated DataReader is open?
[英]Open DataReader error with SqlConnection
在我的项目中,我有一个 function 像这样从 Sql2005 服务器检索数据,
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。 有没有办法解决这个问题?
要为每个连接打开两个阅读器,您需要启用 MARS(多个活动结果集)。 您可以通过连接字符串执行此操作:
Server=myServerAddress;Database=myDataBase;Trusted_Connection=True; MultipleActiveResultSets=true;
但是,不建议采用这种方法。
我相信您可以通过一次查询来检索所需的数据。
如果您想对单个查询提出建议,您需要解释需要检索的内容。
我假设您显示的代码只是一个示例,而不是真实的,因为它没有多大意义。
看看“火星都是好消息,还是有任何不利因素?” 部分在这里。
解决此问题的最佳方法是在数据库中将两个表连接在一起。 这应该会给你至少一个数量级的性能提升,尤其是在适当的列上有索引的情况下。
数据结构不参与其中; 这完全取决于您如何订购结果以及您如何阅读它们。 正确完成后,您可以将其读入任何可以想象的数据结构。
但如果这不是一个选项,请确保您至少使用 Sql Server 2005 并将MultipleActiveResultSets=true
添加到您的连接字符串。
当您使用它时,您现有的代码已损坏,最终可能导致您的数据库不可用,因为在发生异常的情况下无法保证关闭您的连接。 要解决此问题,请在using
块内创建 SqlConnection object。
如果您不能创建第二个 SQL 连接,那么您可以启用MARS (多个活动结果集)。
为什么你不想要第二个连接?
在 .net 4 中,您不需要检查 hasrows 条件。 Reader.Read() 方法根据表内容返回真/假。 刚刚检查了空表。 工作!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.