DataReader异常:读取器关闭时调用Read的尝试无效

时间:2018-01-16 19:53:55

标签: c# datareader

为什么我会收到datareader异常:读取器关闭时无效尝试调用Read。当我逐步使用调试器时,程序崩溃(dbReader.Read())。 dbReader包含在using语句中,所以我不明白读者是如何关闭的。

 using (OleDbDataReader dbReader = dbCommand.ExecuteReader())
 {
    if (dbReader.HasRows)
    {
       dataTable.Load(dbReader);

       while (dbReader.Read())
       {
          //Processing
       }
    }
 }

2 个答案:

答案 0 :(得分:0)

读者只能被消费一次。如果您使用阅读器填充DataTable:就是这样 - 数据就消失了。它基本上是套接字上的一个序列 - 它是不可重复的。

所以:对已经加载的数据运行业务逻辑。

答案 1 :(得分:0)

正如在Marc Gravell♦中已经指出his answer,您只能阅读一次。

但回答你的评论:

  

我想将数据加载到数据表中,但也要为每一行执行业务逻辑

您可以通过迭代所有收到的字段来手动创建DataTable,如:

var dataTable = new DataTable(tableName);

for (int field = 0; field < dataReader.FieldCount; field++)
{
    var column = new DataColumn(dataReader.GetName(field), dataReader.GetFieldType(field));
    dataTable.Columns.Add(column);
}

之后,您可以开始一行接一行地读取数据并填充DataTable行,如:

while ( dataReader.Read() )
{
    var dataRow = dataTable.NewRow();

    // Option 1
    for (int i = 0; i < dataReader.FieldCount; i++)
    {
        dataRow[i] = dataReader[i];
    }

    // or Option 2
    dataRow["col1"] = dataReader["col1"];
    dataRow["col2"] = dataReader["col2"];
    dataRow["col3"] = dataReader["col3"];

    // or something else
    // ...


    dataTable.Rows.Add(dataRow);
}

您还可以在Docs - DataTable.Load-Examples找到一些示例。 或者有关详细信息,请参阅DataAdapters and DataReaders