Подтвердить что ты не робот

Разница между получением значения от DataRow

Пример кода:

    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")? Конечно, второй способ отличить значение какого-то типа, но есть ли другая разница?
  • Какой метод лучше использовать?
4b9b3361

Ответ 1

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

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

Если значение указанного DataColumn равно null и T является тип ссылки или тип NULL, тип возврата будет null. Метод поля не возвращает значение.

Метод 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 также поддерживает типы с нулевым.

>

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

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