DataRow: выбор значения ячейки по заданному имени столбца. - PullRequest
39 голосов
/ 19 августа 2011

У меня проблема с DataRow, с которым я действительно борюсь.

Данные считываются из электронной таблицы Excel с использованием OleDbConnection.

Если я пытаюсь выбрать данные из DataRow, используя имя столбца, он возвращает DBNull, даже если там есть данные.

Но не все так просто.

datarow.Table.Columns[5].ColumnName возвращает "мой столбец".
datarow["my column"] возвращает DBNull.
datarow[5] возвращает 500.
datarow[datarow.Table.Columns[5].ColumnName] возвращает DBNull. (просто чтобы убедиться, что это не опечатка!)

Я мог бы просто выбирать вещи из базы данных, используя номер столбца, но мне не нравится это делать, поскольку, если изменится порядок столбцов, программа сломается.

Ответы [ 7 ]

54 голосов
/ 19 августа 2011

Какую версию .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));
}
46 голосов
/ 19 июня 2014

Это должна быть новая функция или что-то еще, в противном случае я не уверен, почему она не была упомянута.

Вы можете получить доступ к значению в столбце в объекте DataRow, используя row["ColumnName"]:

DataRow row = table.Rows[0];
string rowValue = row["ColumnName"].ToString();
9 голосов
/ 16 марта 2017

Мне проще получить к нему доступ, сделав следующее:

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

        }
6 голосов
/ 19 августа 2011

Подсказка

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];        
    }
}
2 голосов
/ 22 апреля 2016

В дополнение к тому, что сказал Джимми, вы также можете сделать универсальный выбор, используя Convert.ChangeType вместе с необходимыми проверками нуля:

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;
  }
1 голос
/ 04 января 2019

Вы можете получить значение столбца в VB.net

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

А в C # вы можете использовать Ответ Джимми , просто будьте осторожны при преобразовании его в ToString().Может выдать нулевое исключение, если вместо данных используются нулевые значения. Convert.ToString(your_expression), чтобы избежать нулевого исключения ссылка

0 голосов
/ 20 июля 2018
for (int i=0;i < Table.Rows.Count;i++)
{
      Var YourValue = Table.Rows[i]["ColumnName"];
}
...