it-roy-ru.com

DataRow: выбор значения ячейки по заданному имени столбца.

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

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

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

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

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

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

34
VaticanUK

Какую версию .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));
}
51
Hassan

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

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

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

Мне легче получить к нему доступ, выполнив следующие действия:

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

        }
8
Gabriel G

Намек

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

Вдобавок к тому, что сказал Джимми, вы также можете сделать родовой выбор, используя 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;
  }
2
Abraham Roy

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

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

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

1
Kamran
for (int i=0;i < Table.Rows.Count;i++)
{
      Var YourValue = Table.Rows[i]["ColumnName"];
}
0
Himadripatel1986