25

好的,我想提取DataRow一个DataReader. 我环顾四周已经有一段时间了,看起来没有一种简单的方法可以做到这一点。

我知道 aDataReader更多的是行的集合,但它当时只读取一行。

所以我的问题是:有什么方法可以提取 aDataRow的当前行DataReader吗?

4

2 回答 2

29

有没有办法从 DataReader 的当前行中提取 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];
        }
    }
}

但这并不是真正有效的。

于 2013-08-29T13:02:48.557 回答
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());

但是正如蒂姆指出的那样,如果您事先知道每次迭代都需要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在每次迭代时从 (fully-pre-loaded ) 中获取每一行。但既然DataTable.com 更全面,真的没有理由不放弃DataReader之后做DataTable.Load().

于 2018-03-30T05:12:19.577 回答