DataRow:按给定的列名称select单元格值

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

数据行是使用OleDbConnection从Excel电子表格中读入的。

如果我尝试使用列名从DataRow中select数据,即使有数据,也会返回DBNull。

但事情并不那么简单。

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

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

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

这必须是一个新的function或东西,否则我不知道为什么没有提到。

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

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

我发现通过执行以下操作可以更轻松地访问它:

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

暗示

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

除了Jimmy所说的之外,还可以使用Convert.ChangeType和必要的空检查来selectgenerics:

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