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

时间:2013-08-29 12:58:31

标签: c# datarow datareader

好的,我想从DataRow中提取DataReader。我一直在寻找一段时间,看起来没有一种简单的方法可以做到这一点。

我理解DataReader更多是行的集合,但当时只读取了一行。

所以我的问题是:有没有办法从DataRow的当前行中提取DataReader

2 个答案:

答案 0 :(得分:24)

  

有没有办法从当前行中提取DataRow   DataReader?

不,至少没有简单的方法。每个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];
        }
    }
}

但这并不是很有效。

答案 1 :(得分:0)

您可能会问,因为您的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,我想你可以在第一个例子中添加一个循环索引整数,然后从(完全预加载的{{1} })每次迭代。但由于DataTable全面丰富,因此在DataTable之后没有理由不放弃DataReader