【问题标题】:How to check if a column exists in a datatable如何检查数据表中是否存在列
【发布时间】:2013-07-16 09:24:30
【问题描述】:

我有一个用 csv 文件的内容生成的数据表。我使用其他信息将 csv 的某些列(现在在数据表中)映射到用户需要填写的信息。

在最好的世界里,映射总是可能的。但这不是现实......所以在我尝试映射数据表列值之前,我需要检查该列是否存在。如果我不做这个检查,我有一个 ArgumentException。

当然我可以用这样的代码来检查:

try
{
    //try to map here.
}
catch (ArgumentException)
{ }

但我现在有 3 列要映射,部分或全部可能存在/缺失

有没有检查数据表中是否存在列的好方法?

【问题讨论】:

  • 你在和DataSet/DataTable打交道吗?如果是这样,您可以查看表的 Column 集合以获取表中所有列的列表。
  • 是的,@asawyer csv 的内容被转储到数据表中。我会朝这个方向看看。

标签: c# datatable argumentexception


【解决方案1】:

你可以使用operator Contains

private void ContainColumn(string columnName, DataTable table)
{
    DataColumnCollection columns = table.Columns;        
    if (columns.Contains(columnName))
    {
       ....
    }
}

MSDN - DataColumnCollection.Contains()

【讨论】:

  • 你确定这是 linq 吗?我的代码和这项工作中没有对 linq 的任何引用
  • 它是简单的列操作符
  • 这不是 linq 扩展方法,而是 DataColumnCollection 类型的成员,但也可以很好地工作。
  • @AghilasYakoub 当然是,我忘了那个。在这种情况下,可能也是更好的方法。但有一件事,“你可以使用操作符包含”——它不是一个操作符,它是一个成员方法。
【解决方案2】:

您可以查看给定DataTableColumns 属性,它是表中所有列的列表。

private void PrintValues(DataTable table)
{
    foreach(DataRow row in table.Rows)
    {
        foreach(DataColumn column in table.Columns)
        {
            Console.WriteLine(row[column]);
        }
    }
}

http://msdn.microsoft.com/en-us/library/system.data.datatable.columns.aspx

【讨论】:

    【解决方案3】:
    myDataTable.Columns.Contains("col_name")
    

    【讨论】:

      【解决方案4】:

      对于多列,您可以使用与下面给出的代码类似的代码。我刚刚经历了这个并找到了检查 Datatable 中多列的答案。

       private bool IsAllColumnExist(DataTable tableNameToCheck, List<string> columnsNames)
          {
              bool iscolumnExist = true;
              try
              {
                  if (null != tableNameToCheck && tableNameToCheck.Columns != null)
                  {
                      foreach (string columnName in columnsNames)
                      {
                          if (!tableNameToCheck.Columns.Contains(columnName))
                          {
                              iscolumnExist = false;
                              break;
                          }
                      }
                  }
                  else
                  {
                      iscolumnExist = false;
                  }
              }            
              catch (Exception ex)
              {
      
              }
              return iscolumnExist;
          }
      

      【讨论】:

        【解决方案5】:
        DataColumnCollection col = datatable.Columns;        
        if (!columns.Contains("ColumnName1"))
        {
           //Column1 Not Exists
        }
        
        if (columns.Contains("ColumnName2"))
        {
           //Column2 Exists
        }
        

        【讨论】:

          【解决方案6】:

          使用 IndexOf 更准确:

          If dt.Columns.IndexOf("ColumnName") = -1 Then
              'Column not exist
          End If
          

          如果使用 Contains,则不会区分 ColumName 和 ColumnName2。

          【讨论】:

          • 包含没有你描述的行为。它不像 string.contains。更多的是“我的收藏是否包含具有此名称的列?”而不是“我的收藏是否包含一个名称包含此名称的列?”
          【解决方案7】:

          根据接受的答案,我做了一个扩展方法来检查表中是否存在列

          我为谁担心。

           public static class DatatableHelper
           {
                  public static bool ContainColumn(this DataTable table, string columnName)
                  {
                      DataColumnCollection columns = table.Columns;
                      if (columns.Contains(columnName))
                      {
                          return true;
                      }
          
                      return false;
                  }
          }
          

          并用作dtTagData.ContainColumn("SystemName")

          【讨论】:

            猜你喜欢
            • 2012-01-26
            • 2012-07-26
            • 2021-08-19
            • 2019-11-13
            • 2022-01-01
            • 1970-01-01
            • 2016-02-23
            • 2019-03-14
            • 2014-09-25
            相关资源
            最近更新 更多