【问题标题】:DataRow: Select cell value by a given column nameDataRow:通过给定的列名选择单元格值
【发布时间】:2011-10-30 12:06:12
【问题描述】:

我的 DataRow 有一个问题,我真的很苦恼。

使用 OleDbConnection 从 Excel 电子表格中读取数据行。

如果我尝试使用列名从 DataRow 中选择数据,即使那里有数据,它也会返回 DBNull。

但事情没那么简单。

datarow.Table.Columns[5].ColumnName 返回“我的列”。
datarow["my column"] 返回 DBNull。
datarow[5] 返回 500。
datarow[datarow.Table.Columns[5].ColumnName] 返回 DBNull。 (只是为了确保它不是错字!)

我可以使用列号从数据行中选择内容,但我不喜欢这样做,因为如果列顺序发生变化,软件就会中断。

【问题讨论】:

  • 您的电子表格是什么样的?顶部有空行吗?你的连接字符串是什么?重现它所需的最少代码量是多少? (包括样品表)

标签: c# .net excel datarow


【解决方案1】:

提示

DataTable table = new DataTable();
table.Columns.Add("Column#1", typeof(int));
table.Columns.Add("Column#2", typeof(string));
table.Rows.Add(5, "Cell1-1");
table.Rows.Add(130, "Cell2-2");

编辑:添加更多

string cellValue = table.Rows[0].GetCellValueByName<string>("Column#2");

public static class DataRowExtensions
{
    public static T GetCellValueByName<T>(this DataRow row, string columnName)
    {
        int index = row.Table.Columns.IndexOf(columnName);
        return (index < 0 || index > row.ItemArray.Count()) 
                  ? default(T) 
                  : (T) row[index];        
    }
}

【讨论】:

    【解决方案2】:

    您使用的是哪个版本的 .NET?从 .NET 3.5 开始,有一个程序集 System.Data.DataSetExtensions,其中包含对 dataTables、dataRows 等的各种有用的扩展。

    你可以试试

    row.Field<type>("fieldName");
    

    如果这不起作用,您可以这样做:

    DataTable table = new DataTable();
    var myColumn = table.Columns.Cast<DataColumn>().SingleOrDefault(col => col.ColumnName == "myColumnName");
    if (myColumn != null)
    {
        // just some roww
        var tableRow = table.AsEnumerable().First();
        var myData = tableRow.Field<string>(myColumn);
        // or if above does not work
        myData = tableRow.Field<string>(table.Columns.IndexOf(myColumn));
    }
    

    【讨论】:

    • 将此标记为答案,因为它引导我弄清楚发生了什么。原来我在使用 Quick Watch 时输入了错误的列 ID。即使行中有数据,键入正确的列 id 也会返回 null。我不完全确定它为什么返回 null,但我猜它与解释数据类型有关,因为这是唯一具有非 null 值的行,并且在所有其他行中将 null 替换为 0使其也返回该行的正确值。
    • 看看吉米的回答。它更容易完成工作。使用 .NET Framework 4.7.2,我没有运气。
    【解决方案3】:

    这一定是新功能什么的,否则我不知道为什么没有提到。

    您可以使用row["ColumnName"] 访问DataRow 对象的列中的值:

    DataRow row = table.Rows[0];
    string rowValue = row["ColumnName"].ToString();
    

    【讨论】:

    • 如果数据条目为NULL,我相信调用ToString时会抛出错误。
    • @Zorgarath,真实的事实。如果table 没有行,您也会收到错误消息。
    • 谢谢。我知道这是可能的,但我不记得语法,你也无法通过评估看到它
    【解决方案4】:

    除了 Jimmy 所说的之外,您还可以通过使用 Convert.ChangeType 以及必要的 null 检查来使 select 通用:

    public T GetColumnValue<T>(DataRow row, string columnName)
      {
            T value = default(T);
            if (row.Table.Columns.Contains(columnName) && row[columnName] != null && !String.IsNullOrWhiteSpace(row[columnName].ToString()))
            {
                value = (T)Convert.ChangeType(row[columnName].ToString(), typeof(T));
            }
    
            return value;
      }
    

    【讨论】:

      【解决方案5】:

      我发现通过执行以下操作更容易访问它:

              for (int i = 0; i < Table.Rows.Count-1; i++) //Looping through rows
              {
                  var myValue = Table.Rows[i]["MyFieldName"]; //Getting my field value
      
              }
      

      【讨论】:

        【解决方案6】:
        for (int i=0;i < Table.Rows.Count;i++)
        {
              Var YourValue = Table.Rows[i]["ColumnName"];
        }
        

        【讨论】:

          【解决方案7】:

          可以在VB.net中获取列值

          Dim row As DataRow = fooTable.Rows(0)
          Dim temp = Convert.ToString(row("ColumnName"))
          

          在 C# 中,您可以使用 Jimmy's Answer,只是在将其转换为 ToString() 时要小心。如果数据为空,它可以抛出空异常 而是使用Convert.ToString(your_expression) 来避免空异常reference

          【讨论】:

            【解决方案8】:

            注意数据类型。如果不匹配则会抛出错误。

            var fieldName = dataRow.Field<DataType>("fieldName");
            

            【讨论】:

              【解决方案9】:

              简单的解决方案: 假设 sqlDt 包含 DataTable,那么这将为您提供 行中名为“aaa”的列是:

              Dim fldContent = sqlDte.Rows(iz).ItemArray(sqlDte.Columns.Item("aaa").Ordinal)
              Console.WriteLine("aaa = " & fldContent)   
              

              修改代码格式

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-11-14
                • 1970-01-01
                • 2018-11-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-11-06
                相关资源
                最近更新 更多