DataRow:按给定列名选择单元格值

时间:2011-08-19 10:03:33

标签: c# .net excel datarow

我遇到了一个我正在努力解决的DataRow问题。

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

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

但它并不那么简单。

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

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

9 个答案:

答案 0 :(得分:53)

您使用的是哪个版本的.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));
}

答案 1 :(得分:47)

这必须是一个新功能或其他东西,否则我不确定为什么没有提到它。

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

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

答案 2 :(得分:8)

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

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

        }

答案 3 :(得分:6)

提示

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];        
    }
}

答案 4 :(得分:2)

除了Jimmy所说的,你还可以使用Convert.ChangeType以及必要的空检查来制作选择通用:

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 :(得分:1)

您可以在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

答案 6 :(得分:0)

for (int i=0;i < Table.Rows.Count;i++)
{
      Var YourValue = Table.Rows[i]["ColumnName"];
}

答案 7 :(得分:0)

请注意数据类型。如果不匹配,则会引发错误。

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

答案 8 :(得分:0)

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

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

编辑代码格式