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