【问题标题】:How to Get a Specific Column Value from a DataTable?如何从数据表中获取特定的列值?
【发布时间】:2010-05-26 20:35:31
【问题描述】:

我有一个数据表。我需要根据用户输入获取某个列值。例如,假设数据表有两列 CountryID 和 CountryName。

我需要根据用户输入的国家名称在数据表中找到 CountryID。我可以打开与 DB 的连接并运行查询 select countryID from Country where countryName = @userinput。无论如何我可以在数据表上做到这一点。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:
    string countryName = "USA";
    DataTable dt = new DataTable();
    int id = (from DataRow dr in dt.Rows
                  where (string)dr["CountryName"] == countryName
                  select (int)dr["id"]).FirstOrDefault();
    

    【讨论】:

      【解决方案2】:
      foreach (DataRow row in Datatable.Rows) 
      {
          if (row["CountryName"].ToString() == userInput) 
          {
              return row["CountryID"];
          }
      }
      

      虽然这可能无法直接编译,但您应该明白这一点,但我相信通过 SQL 进行查询会非常优越,因为巨大的数据表需要很长时间才能遍历所有行。

      【讨论】:

      • 简单明了,但正如您所说,这在以后可能会花费很多。
      • 总而言之,没有什么比只使用 SQL 更高效了,LINQ to Datatables 和 Datatables/Dataviews 都必须将所有记录加载到内存中然后查询它们
      • 另一种选择只是使用 linq to sql
      • 这是处理大量数据的最快、最直接的方法。最佳答案恕我直言。
      【解决方案3】:

      我建议基于扩展方法的这种方式:

      IEnumerable<Int32> countryIDs =
          dataTable
          .AsEnumerable()
          .Where(row => row.Field<String>("CountryName") == countryName)
          .Select(row => row.Field<Int32>("CountryID"));
      

      需要引用System.Data.DataSetExtensions.dll。

      【讨论】:

      • 这正是我想要的,谢谢!我几乎错过了你对参考文献的最后评论——也谢谢你。
      【解决方案4】:

      根据帖子的标题,我只需要从特定列中获取所有值。这是我用来实现这一目标的代码。

          public static IEnumerable<T> ColumnValues<T>(this DataColumn self)
          {
              return self.Table.Select().Select(dr => (T)Convert.ChangeType(dr[self], typeof(T)));
          }
      

      【讨论】:

        【解决方案5】:

        我想您可以改用 DataView 对象,这样您就可以利用 RowFilter 属性,如下所述:

        http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

        private void MakeDataView() 
        {
            DataView view = new DataView();
        
            view.Table = DataSet1.Tables["Countries"];
            view.RowFilter = "CountryName = 'France'";
            view.RowStateFilter = DataViewRowState.ModifiedCurrent;
        
            // Simple-bind to a TextBox control
            Text1.DataBindings.Add("Text", view, "CountryID");
        }
        

        【讨论】:

        • 谢谢,我还没试过。我可以将值移动到变量而不是绑定到文本字段吗?
        • 未测试,但您可以尝试:string CountryName = view.Table.Rows[0]["CountryName"].ToString();
        【解决方案6】:

        数据表有一个 .Select 方法,该方法根据您指定的条件返回一个行数组。像这样的:

        Dim oRows() As DataRow
        
        oRows = dtCountries.Select("CountryName = '" & userinput & "'")
        
        If oRows.Count = 0 Then
           ' No rows found
        Else
           ' At least one row found. Could be more than one
        End If
        

        当然,如果用户输入包含 ' 字符,它会引发异常(例如,如果您查询数据库)。你应该转义 ' 字符(我使用一个函数来做到这一点)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多