【问题标题】:Call Dataset property in foreach loop在 foreach 循环中调用数据集属性
【发布时间】:2012-04-10 07:02:16
【问题描述】:

我有一个数据集,我想在作为属性的 foreach 循环中调用它。我不想使用 .table["xxx"]

public DataSet run(string query)
{ 
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = new SqlCommand(query, conn);
    adapter.Fill(dataset);
    return dataset;
}

string query = "select * from table";
foreach (DataRow row in  run(query))
{
//
}

【问题讨论】:

  • 如果只想使用DataTable,为什么要填充DataSet? DataTable 有一个重载:msdn.microsoft.com/en-us/library/905keexk.aspx
  • 数据集没有行,它们有表。所以你需要先遍历表。您还需要声明 DataSet :-)

标签: c# sql model-view-controller


【解决方案1】:

DataSet 没有任何方法可以返回 DataRow 对象。

如果您无法指定返回的 TableName,您可以使用这样的数字索引:

foreach (DataRow row in  run(query).Tables[0].Rows)
{
//
}

如果您的查询可能返回多于一行,您应该像这样遍历所有表:

foreach(DataTable table in run(query).Tables)
{
    foreach(DataRow row in table.Rows)
    {
        foreach (DataColumn column in table.Columns)
        {
            //
        }
    }
}

【讨论】:

    【解决方案2】:

    您应该改用DataTable

    【讨论】:

      【解决方案3】:

      这不是您想要避免的确切:这至少是一个数字索引。但这让我想知道您的原始数据集是在哪里声明的。

      foreach (DataRow row in  run(query).Tables[0].Rows)
      {
         //
      }
      

      只是警告你:你的 run() 方法是一种反模式。我看到很多人想将数据库调用抽象为一个接受字符串的简单方法,他们几乎总是忘记一件重要的事情:查询参数。结果是整个项目中散落的代码使用字符串连接以不安全的方式构建 sql。

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多