c# - 使用 foreach 遍历 DataTableReader 中的行

标签 c# asp.net sql-server foreach

我可以使用 foreach(r 中的 DataRow 行)吗?

我有这个代码:

    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)

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

无法将“System.Data.Common.DataRecordInternal”类型的对象转换为类型“System.Data.DataRow”

我该如何解决?

最佳答案

foreach 试图从 DataTableReader 中转换一个 DataRow,但它不能。

DataTableReader 读取 行,但没有 行。它只能逐行读取 DataTable 中的行。 Rafa 在这篇博文中的回答超越了 DataTableReader 的最佳使用。

如果您必须使用 DataTableReader,那么只需将它放在 while 循环中:

while (r.Read())
{
    //Access r with r["columnName"]
}

如果您想要foreach,只需遍历DataTable 本身中的行:

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

就性能而言,我认为 foreach 会更好,因为它不需要您实例化另一个对象(DataTableReader),您还可以得到如果您想修改行的内容,则可以对行进行写访问。

关于c# - 使用 foreach 遍历 DataTableReader 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22261877/

相关文章:

c# - Azure 字符串未被识别为有效的日期时间

c# - 在 C# 中使用命名空间

c# - 检查 Request.QueryString 中是否存在未分配的变量

sql-server - 关于行存储数据页概念,聚集列存储索引和非聚集列存储索引有什么区别

sql-server - 使用联接仅显示没有匹配外键的记录

c# - NCron - 看不到作业

c# - 绘制树形图最简单的方法?

c# - 使用 Datapager 在 asp.net 中分页 - 下一个、上一个按钮

sql - 等于一是什么意思 - ISNULL (something, 1) = 1

c# 如何处理这种泛型约束?