DataRow:根据给定的列名选择单元格值
本文关键字:选择 单元格 DataRow | 更新日期: 2023-09-27 18:06:11
我有一个DataRow的问题,我真的很挣扎。
使用OleDbConnection从Excel电子表格中读取数据。
如果我尝试使用列名从DataRow中选择数据,即使那里有数据,它也会返回DBNull。
但事情并没有那么简单。
datarow.Table.Columns[5].ColumnName
返回"my column"。datarow["my column"]
返回DBNull.datarow[5]
返回500 datarow[datarow.Table.Columns[5].ColumnName]
返回DBNull。(只是为了确保这不是一个打字错误!)
我可以使用列号从数据流中选择东西,但我不喜欢这样做,因为如果列顺序改变,软件会崩溃。
你使用的是哪个版本的。net ?从。net 3.5开始,有一个汇编System.Data。DataSetExtensions,其中包含各种有用的扩展,用于数据表,数据表和类似的。
你可以尝试使用
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));
}
这一定是一个新功能,否则我不知道为什么没有被提及。
可以使用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");
EDIT:添加更多
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
以及必要的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;
}
您可以在VB.net中获取列值
Dim row As DataRow = fooTable.Rows(0)
Dim temp = Convert.ToString(row("ColumnName"))
在c#中,你可以使用Jimmy's Answer,只是在将其转换为ToString()
时要小心。如果数据为空,则会抛出空异常使用Convert.ToString(your_expression)
来避免null异常引用
for (int i=0;i < Table.Rows.Count;i++)
{
Var YourValue = Table.Rows[i]["ColumnName"];
}
注意数据类型。如果不匹配,则抛出错误。
var fieldName = dataRow.Field<DataType>("fieldName");
简单的解决方案:假设sqlDt包含数据表,那么这将为您提供列名称为"aaa"第一行为:
Dim fldContent = sqlDte.Rows(iz).ItemArray(sqlDte.Columns.Item("aaa").Ordinal)
Console.WriteLine("aaa = " & fldContent)
编辑代码格式