好的,我想从DataRow
中提取DataReader
。我一直在寻找一段时间,看起来没有一种简单的方法可以做到这一点。
我理解DataReader
更多是行的集合,但当时只读取了一行。
所以我的问题是:有没有办法从DataRow
的当前行中提取DataReader
?
答案 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
。