DataRow:通过给定的列名称选择单元格值

发布于 2024-11-30 04:29:48 字数 448 浏览 1 评论 0原文

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

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

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

但事情并不那么简单。

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

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

I have a problem with a DataRow that I'm really struggling with.

The datarow is read in from an Excel spreadsheet using an OleDbConnection.

If I try to select data from the DataRow using the column name, it returns DBNull even though there is data there.

But it's not quite that simple.

datarow.Table.Columns[5].ColumnName returns "my column".
datarow["my column"] returns DBNull.
datarow[5] returns 500.
datarow[datarow.Table.Columns[5].ColumnName] returns DBNull. (just to make sure its not a typo!)

I could just select things from the datarow using the column number, but I dislike doing that since if the column ordering changes, the software will break.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

残龙傲雪 2024-12-07 04:29:48

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

Which version of .NET are you using? Since .NET 3.5, there's an assembly System.Data.DataSetExtensions, which contains various useful extensions for dataTables, dataRows and the like.

You can try using

row.Field<type>("fieldName");

if that doesn't work, you can do this:

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));
}
夜无邪 2024-12-07 04:29:48

这肯定是一个新功能什么的,否则我不知道为什么没有被提及。

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

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

This must be a new feature or something, otherwise I'm not sure why it hasn't been mentioned.

You can access the value in a column in a DataRow object using row["ColumnName"]:

DataRow row = table.Rows[0];
string rowValue = row["ColumnName"].ToString();
贪恋 2024-12-07 04:29:48

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

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

        }

I find it easier to access it by doing the following:

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

        }
我的奇迹 2024-12-07 04:29:48

提示

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

Hint

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: Added more

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];        
    }
}
最佳男配角 2024-12-07 04:29:48

除了 Jimmy 所说的之外,您还可以使用 Convert.ChangeType 以及必要的 null 检查来使选择通用:

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

On top of what Jimmy said, you can also make the select generic by using Convert.ChangeType along with the necessary null checks:

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;
  }
揪着可爱 2024-12-07 04:29:48

您可以在 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 异常参考

You can get the column value in VB.net

Dim row As DataRow = fooTable.Rows(0)
Dim temp = Convert.ToString(row("ColumnName"))

And in C# you can use Jimmy's Answer, just be careful while converting it to ToString(). It can throw null exception if the data is null
instead Use Convert.ToString(your_expression) to avoid null exception reference

寄人书 2024-12-07 04:29:48
for (int i=0;i < Table.Rows.Count;i++)
{
      Var YourValue = Table.Rows[i]["ColumnName"];
}
for (int i=0;i < Table.Rows.Count;i++)
{
      Var YourValue = Table.Rows[i]["ColumnName"];
}
怪我太投入 2024-12-07 04:29:48

请注意数据类型。如果不匹配就会抛出错误。

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

Be careful on datatype. If not match it will throw an error.

var fieldName = dataRow.Field<DataType>("fieldName");
抹茶夏天i‖ 2024-12-07 04:29:48

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

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

编辑的代码格式

Simple solution:
Assume sqlDt contains the DataTable, then this will give you the content of the
column named "aaa" in row is:

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

Edited code formatting

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文