【问题标题】:already an open DataReader associated with this Command - when I'm not using datareader?已经打开了与此命令关联的 DataReader - 当我不使用 datareader 时?
【发布时间】:2010-07-28 21:37:36
【问题描述】:

当我不使用 datareader 时,我收到一个与此命令关联的打开 DataReader 的错误(尽管可能 executereader() 是同一件事)如果我没有 datareader,我将如何关闭它?

using (SqlConnection conn = new SqlConnection(ConnectionString))
{
  SqlCommand cmd = new SqlCommand("spSelectAllTypes",conn);
  cmd.CommandType = CommandType.StoredProcedure;
  SqlCommand cmd1 = new SqlCommand("spSelectAllTripA", conn);
  cmd1.CommandType = CommandType.StoredProcedure;

  conn.Open();

  //checkboxlist
  cbTransportType.DataSource = cmd.ExecuteReader();
  cbTransportType.DataBind();

  //dropdownlist
  ddlTripTypeA.DataSource = cmd1.ExecuteReader();
  ddlTripTypeA.DataTextField = "TripType";
  ddlTripTypeA.DataValueField = "TripTypeID";
  ddlTripTypeA.DataBind();

}

我只想能够在一个打开的连接中绑定一堆下拉列表。 (在我为每个控件进行多次打开和关闭之前)

【问题讨论】:

  • 您可以发布异常详细信息吗?
  • 我建议你试试 Linq2Sql 并用它来访问存储过程。它包装了您的低级数据库命令,并且还保护您免受此类异常的影响。您的问题是,您必须先从 cmd 关闭阅读器,然后才能在 cmd1 上执行阅读器....
  • ExecuteReader 返回一个 SqlDataReader,因此在调用 ExecuteReader msdn.microsoft.com/en-us/library/… 后确实有一个打开的阅读器(在 cbTransportType.DataSource 中存储了一个引用)
  • 在您的示例中,它显示使用数据读取器并关闭它,我理解。但是如何使用数据读取器作为数据源呢? (或填充下拉列表、复选框列表等。

标签: c# asp.net sql


【解决方案1】:

ExecuteReader 将返回一个开放的数据阅读器。你真的应该在连接关闭之前处理掉它,但是我不确定你将它用作数据源会是什么样子。

【讨论】:

  • 理想情况下,您不应该直接使用 datareader 作为数据源。
  • 我不是说你在用它。我说的是笼统的。
【解决方案2】:

我想我找到了解决方法,让我知道这是否可以编码...

 using (SqlConnection conn = new SqlConnection(ConnectionString))
  {
     SqlCommand cmd1 = new SqlCommand("spSelectAllTypeA", conn);
                 cmd1.CommandType = CommandType.StoredProcedure;
     SqlCommand cmd2 = new SqlCommand("spSelectAllTypeB", conn);

conn.Open();

    setDDL(ref ddlTripTypeA, cmd1, "Type", "pkiTypeAID");

    setDDL(ref ddlTripTypeB, cmd2, "Type", "pkiTypeBID");
}
    ..end of method..

    protected void setDDL( ref DropDownList ddl, SqlCommand cmd, string textField, string valueField)
        {
            SqlDataReader reader = cmd.ExecuteReader();
            ddl.DataSource = reader;
            ddl.DataTextField = textField;
            ddl.DataValueField = valueField;
            ddl.DataBind();
            reader.Close();
        }

非常适合填充下拉列表,我想我可以让它对每个控件更通用..想法?

【讨论】:

  • 第一种方法的代码不可重用。为什么必须使用 DataReader?例如,使用 DataSets/DataTables 比传递 DropDownList 引用要容易得多。但这只是我的偏好。
  • 我想我不需要数据阅读器。使用数据集的资源是否更少? - 不知道你所说的不可重用是什么意思......我应该让它自己的类,现在它只用于下拉列表,我想我可以让它通过一个控件,然后根据控件做不同的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多