好的,我想提取DataRow
一个DataReader
. 我环顾四周已经有一段时间了,看起来没有一种简单的方法可以做到这一点。
我知道 aDataReader
更多的是行的集合,但它当时只读取一行。
所以我的问题是:有什么方法可以提取 aDataRow
的当前行DataReader
吗?
好的,我想提取DataRow
一个DataReader
. 我环顾四周已经有一段时间了,看起来没有一种简单的方法可以做到这一点。
我知道 aDataReader
更多的是行的集合,但它当时只读取一行。
所以我的问题是:有什么方法可以提取 aDataRow
的当前行DataReader
吗?
有没有办法从 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];
}
}
}
但这并不是真正有效的。
您可能会问,因为您的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()
.