如何从DataReader的当前行中获取DataRow?

问题描述 投票:0回答:3

好的,我想从

DataRow
中提取出
DataReader
。我已经四处寻找很长一段时间了,看起来没有一个简单的方法可以做到这一点。

我知道

DataReader
更多的是行的集合,但它一次只读取一行。

所以我的问题:有没有办法从

DataRow
的当前行中提取
DataReader

c# datarow datareader
3个回答
33
投票

有没有办法从当前行中提取 DataRow 数据读取器?

不,至少没有简单的方法。每个 DataRow 都属于一个Table。您不能将该属性留空,甚至不能更改表(不使用 ImportRow)。

但是如果您需要 DataRows,为什么不首先填写

DataTable

DataTable table = new DataTable();
using(var con = new SqlConnection("...."))
using(var da = new SqlDataAdapter("SELECT ... WHERE...", con))
    da.Fill(table);
// now you have the row(s)

如果您确实需要从

DataReader
获取行,您可以使用
reader.GetSchemaTable
获取有关列的所有信息:

if (reader.HasRows)
{
    DataTable schemaTable = reader.GetSchemaTable();
    DataTable data = new DataTable();
    foreach (DataRow row in schemaTable.Rows)
    {
        string colName = row.Field<string>("ColumnName");
        Type t = row.Field<Type>("DataType");
        data.Columns.Add(colName, t);
    }
    while (reader.Read())
    {
        var newRow = data.Rows.Add();
        foreach (DataColumn col in data.Columns)
        {
            newRow[col.ColumnName] = reader[col.ColumnName];
        }
    }
}

但这并不是真正有效。


4
投票

您可能会问,因为您有

DataReader
代码,看起来像这样:

static void ViaDataReader(IDataReader rdr)
{
    while (rdr.Read())
        Console.WriteLine("{0,-27} {1,-46} {2,-25} {3}", rdr[0], rdr[1], rdr[2], rdr[3]);
}

/// ...

ViaDataReader(DbProviderFactories.GetFactoryClasses().CreateDataReader());

但正如 Tim 指出的那样,如果您提前知道每次迭代时都需要

DataRow
,则应该使用
DataTable
来代替,然后只需迭代其
Rows
属性(以下输出与上面相同):

static void ViaDataTable(IDataReader rdr)
{
    var table = new DataTable();
    table.Load(rdr);
    foreach (DataRow row in table.Rows)
        Console.WriteLine("{0,-27} {1,-46} {2,-25} {3}", row[0], row[1], row[2], row[3]);
}

/// ...

ViaDataTable(DbProviderFactories.GetFactoryClasses().CreateDataReader());

如果出于某种原因您绝对必须继续使用

DataReader
,我想您可以向第一个示例添加一个循环索引整数,然后在每次迭代时从(完全预加载的
DataTable
)中获取每一行。但既然
DataTable
全方位更丰富,做完
DataReader
之后真的没有理由不放弃
DataTable.Load()


0
投票

我知道这是一个老问题,但我想我应该投入两分钱。

首先,在我的例子中使用数据读取器的原因是我正在处理数百万行。

我的想法是:

While objDataReader.Read()
    Dim currentRow As DataRow
    Dim dt As New DataTable
    dt.Rows.Add(objDataReader)
    currentRow = dt.Rows(0)

    'Do processing...'
     dt = Nothing
     dt.Dispose()
End While
    

我刚刚将此代码添加到我的程序中。希望它有效。

© www.soinside.com 2019 - 2024. All rights reserved.