разница между получением значения из DataRow - PullRequest
19 голосов
/ 18 августа 2011

Пример кода:

    DataTable table = new DataTable();

    // ...
    // insert column to table

    table.Columns.Add("name");

    // ...
    // insert value to table

    foreach (DataRow row in table.Rows) {
         row["name"];
         row.Field<string>("name");     
    }

Мой вопрос:

  • Есть ли разница между использованием row["name"] и row.Field<string>("name")?Конечно, второй способ приводит значение к некоторому типу, но есть ли другое отличие?
  • Какой метод лучше использовать?

Ответы [ 2 ]

16 голосов
/ 18 августа 2011

См. Раздел примечаний , здесь описаны основные различия:

Класс DataSet представляет ноль значений с экземпляром Value DBNull класс.Выражение Language-Integrated Query (LINQ), которое обращалось к столбцу со значением null , генерировало бы InvalidCastException во время выполнения.Кроме того, DataSet не поддерживает обнуляемые типы .Метод Field обеспечивает поддержку доступа к столбцам в виде nullable .Если базовым значением в DataSet является Value, возвращаемый тип Nullable будет иметь значение null .

Если значение указанного DataColumn равно нулю и T - это ссылочный тип или обнуляемый тип, тип возвращаемого значения будет null .Метод Field не будет возвращать Value.

Метод Field не выполняет преобразования типов.Если требуется преобразование типа, сначала необходимо получить значение столбца с помощью метода Field.Затем значение столбца следует преобразовать в другой тип.

В последнем абзаце подчеркивается, что я часто видел числа, хранящиеся в виде строк в базе данных, поэтому преобразование varchar в int будеттребуется при извлечении данных, поэтому в этом случае лучше использовать DataColumn, например:

int test = row.Field<int>("Test"); // InvalidCastException
int test = Convert.ToInt32(row["Test"]); // Works like a charm

DataRowExtensions.Field<T> Method (DataRow, String) впервые появился в .NET 3.5, и он "обеспечивает строго типизированный доступ к каждому из значений столбца вуказанная строка. Метод Field также поддерживает типы nullable . "

Afaik, row["name"] возвращает object, row.Field<string>("name") возвращает String.Мы не должны сравнивать яблоки и груши, поэтому вы должны спросить, что лучше:

row["name"].ToString() против row.Field<string>("name") и ответ: они одинаковые.

0 голосов
/ 18 августа 2011

Это зависит от вашей цели, но если вы посмотрите на определение того и другого, это может вам сказать;

Свойство DataRow.Item (DataColumn) row["name"]

Метод DataRowExtensions.Field (DataRow, DataColumn) row.Field<string>("name")

...