繁体   English   中英

使用 SqlConnection 打开 DataReader 错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM