【问题标题】:Open DataReader error with SqlConnection使用 SqlConnection 打开 DataReader 错误
【发布时间】:2011-09-10 13:44:06
【问题描述】:

在我的项目中,我有一个从 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。有什么办法可以解决 这个问题?

【问题讨论】:

  • 什么数据结构会让你无法一口气执行?你想返回什么? users表和tbl之间的关系是什么?你为什么要检查 user_id == 1?一次性完成的任务越多,开销就越少。
  • 这只是示例代码,我们必须在执行第一个命令后检查和计算,并根据该结果执行另一个命令。谢谢

标签: c# .net sql sql-server sql-server-2005


【解决方案1】:

在 .net 4 中,您不需要检查 hasrows 条件。 Reader.Read() 方法根据表格内容返回真/假。刚刚检查了空表。成功了!!

【讨论】:

    【解决方案2】:

    要为每个连接打开两个阅读器,您需要启用 MARS(多个活动结果集)。 您可以通过连接字符串执行此操作:

     Server=myServerAddress;Database=myDataBase;Trusted_Connection=True; MultipleActiveResultSets=true;
    

    但是,不建议这样做。
    我相信您可以通过一个查询来检索您需要的数据。

    如果需要,您需要说明需要检索的内容并就单个查询提出建议。
    我假设您展示的代码只是一个示例,而不是真实的,因为它没有多大意义。

    看看“火星都是好消息,还是有任何不利因素?”部分here.

    【讨论】:

    【解决方案3】:

    解决此问题的最佳方法是在数据库中将两个表连接在一起。这应该会给你至少一个数量级的性能提升,尤其是在适当的列上有索引的情况下。

    数据结构没有进入这个;这完全取决于您如何排序结果以及如何阅读它们。如果操作正确,您可以将其读入任何可以想象的数据结构中。

    但如果这不是一个选项,请确保您至少使用 Sql Server 2005 并将MultipleActiveResultSets=true 添加到您的连接字符串中。

    当您使用它时,您现有的代码会损坏并最终导致您的数据库不可用,因为无法保证在发生异常的情况下关闭您的连接。要解决此问题,请在 using 块内创建 SqlConnection 对象。

    【讨论】:

      【解决方案4】:

      如果您不能创建第二个 SQL 连接,那么您可以启用 MARS(多个活动结果集)。

      你为什么不想要第二个连接?

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多