为什么我会收到datareader异常:读取器关闭时无效尝试调用Read。当我逐步使用调试器时,程序崩溃(dbReader.Read())。 dbReader包含在using语句中,所以我不明白读者是如何关闭的。
using (OleDbDataReader dbReader = dbCommand.ExecuteReader())
{
if (dbReader.HasRows)
{
dataTable.Load(dbReader);
while (dbReader.Read())
{
//Processing
}
}
}
答案 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。