Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataRow:按给定的列名选择单元格值_C#_.net_Excel_Datarow - Fatal编程技术网

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

C# DataRow:按给定的列名选择单元格值,c#,.net,excel,datarow,C#,.net,Excel,Datarow,我有一个数据行的问题,我真的很挣扎 使用OLEDB连接从Excel电子表格中读取数据行 如果我尝试使用列名从DataRow中选择数据,即使其中有数据,它也会返回DBNull 但这并不是那么简单 datarow.Table.Columns[5]。ColumnName返回我的列。 datarow[my column]返回DBNull。 datarow[5]返回500。 datarow[datarow.Table.Columns[5].ColumnName]返回DBNull。只是为了确保它不是打字错误

我有一个数据行的问题,我真的很挣扎

使用OLEDB连接从Excel电子表格中读取数据行

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

但这并不是那么简单

datarow.Table.Columns[5]。ColumnName返回我的列。 datarow[my column]返回DBNull。 datarow[5]返回500。 datarow[datarow.Table.Columns[5].ColumnName]返回DBNull。只是为了确保它不是打字错误

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

提示

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");
编辑:添加更多


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

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

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


除了Jimmy所说的之外,您还可以通过使用Convert.ChangeType以及必要的空检查使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;
  }

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

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

        }

您可以在VB.net中获取列值

Dim row As DataRow = fooTable.Rows(0)
Dim temp = Convert.ToString(row("ColumnName"))
在C语言中,您可以使用它,但在将其转换为ToString时要小心。如果数据为null,它可以引发null异常
而是使用Convert.ToStringyour_表达式来避免空异常

在数据类型上要小心。如果不匹配,它将抛出一个错误

var fieldName = dataRow.Field<DataType>("fieldName");
简单解决方案: 假设sqlDt包含DataTable,那么这将为您提供 第行中名为aaa的列为:

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

编辑的代码格式

您的电子表格是什么样的?上面有空行吗?你的连接字符串是什么?您需要多少代码来复制它,以便我们可以查看它?包括样本表,将此标记为答案,因为它使我了解了发生的情况。事实证明,在使用Quick Watch时,我输入了错误的列id。即使行中有数据,输入正确的列id也返回null。我不完全确定它为什么返回null,但我猜这与解释数据类型有关,因为这是唯一一行具有非null值,并且在所有其他行中将null替换为0使它也返回此行的正确值。请看Jimmy的答案。这样做更容易,也更有效。我在使用.NET Framework 4.7.2时没有遇到这种情况。如果数据项为空,我相信调用ToString时会抛出错误。@Zorgarath,这是事实。若表中并没有行,也会出现错误。谢谢。我知道这是可能的,但我记不起语法,你也无法通过计算来看到它
Dim row As DataRow = fooTable.Rows(0)
Dim temp = Convert.ToString(row("ColumnName"))
var fieldName = dataRow.Field<DataType>("fieldName");
Dim fldContent = sqlDte.Rows(iz).ItemArray(sqlDte.Columns.Item("aaa").Ordinal)
Console.WriteLine("aaa = " & fldContent)