使用foreach迭代DataTableReader中的行

Ome*_*mer 2 c# sql-server asp.net foreach

我可以用foreach (DataRow row in r)吗?

我有这个代码:

    conStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Server.MapPath("~/App_Data/Database.mdf") + ";Integrated Security=True;User Instance=True";
    string sqlStr = "Select * FROM Msgs WHERE Reciver='"+Reciver+"'";
    SqlDataAdapter daObj = new SqlDataAdapter(sqlStr, conStr);
    DataSet dsObj = new DataSet();
    daObj.Fill(dsObj);
    DataTableReader r = dsObj.Tables[0].CreateDataReader();
    foreach (DataRow row in r)
Run Code Online (Sandbox Code Playgroud)

我运行调试,它停在foreach的行上,并给了我这个错误:

Unable to cast object of type 'System.Data.Common.DataRecordInternal' to type 'System.Data.DataRow

我该如何解决?

Eva*_*n L 6

foreach试图蒙上DataRowDataTableReader其所不能.

一个DataTableReader 读取行,但不具备行.它只能DataTable逐个读取行.拉法在这篇文章中的回答是最好的用法DataTableReader.

如果你必须使用a DataTableReader然后只是把它放在while循环中:

while (r.Read())
{
    //Access r with r["columnName"]
}
Run Code Online (Sandbox Code Playgroud)

如果你想要foreach,只需循环遍历DataTable自己的行:

foreach (DataRow row in dsObj.Tables[0].Rows)
{
    //Do something with the rows
}
Run Code Online (Sandbox Code Playgroud)

在性能方面,我认为foreach只会更好,因为它不需要你实例化另一个对象(DataTableReader如果你想修改它们的内容,你也可以获得对行的写访问权).