Есть ли правильный способ получить поле строки в SQL - PullRequest
4 голосов
/ 02 января 2009

Я видел разные способы получения строкового поля из SQL. Есть ли «правильный» путь и в чем отличия

  SqlDataReader rdr;
  1.  String field = (String) rdr["field"];
  2.  String field = rdr["field"].ToString();
  3.  String field = rdr["field"] As String;

Спасибо! * * 1004

Ответы [ 5 ]

6 голосов
/ 02 января 2009

Вы также можете использовать:

int ordinal=rdr.GetOrdinal("stringField");
if (rdr.IsDBNull(ordinal))
{
    return string.Empty; //Or null or however you want to handle it 
}
else
{   
   rdr.GetString(ordinal);
}

Что, если вы посмотрите на определение SQlDataReader ["field"], будет выглядеть так:

public override object this[string name]
{
    get
    {
        return this.GetValue(this.GetOrdinal(name));
    }
}

По сути, это делает то же самое, только это безопасный тип. Что мне нравится делать, так это создать свой собственный IDataReader, который оборачивает SqlDataReader. CSLA использует механизм аналога, который они называют SafeDataReader, поскольку он обеспечивает перегрузки для всех различных типов данных, которые реализуют этот шаблон.

Если вы знаете, что поле не будет нулевым, вы можете пропустить проверки isDbNull. Из-за многословия я бы порекомендовал поместить это в некоторый тип класса-обертки или вспомогательного класса и сделать из них функции.

4 голосов
/ 02 января 2009
  1. Может вызвать исключение, если тип не является строкой
  2. Определенно неправильно, потому что это может вызвать исключение, если значение равно нулю.
  3. Присвоит значение NULL, если оно равно NULL или имеет тип, отличный от строки

Итак, чтобы быть в безопасности - я бы выбрал 3.

2 голосов
/ 03 января 2009

Имейте в виду, что вопрос взаимодействует с вашими определениями данных. Если «field» было определено как «Not Null», вам не нужно беспокоиться о нулевых данных, и вы должны выбрать # 1 для удобства чтения. Точно так же, если поле обнуляемо, но вы используете функцию «IsNull» при выполнении запроса:

Select IsNull(Field1, '') as Field1 From DBTable Where...

тогда, опять же, вы должны выбрать # 1, потому что вам все равно не нужно беспокоиться о нуле. Конечно, это предполагает, что вы хотите, чтобы нулевое значение было замаскировано пустой строкой. Если вы хотите проверить нулевое значение, потому что это условие ошибки, тогда у вас будет такая логика:

if (nwReader.IsDBNull(nwReader.GetOrdinal("Field1")))
    *throw exception or otherwise handle null condition
string aStr = (string)nwReader["field"];

Этот последний случай, однако, не очень хорошая практика. Если null является недопустимым значением - условием ошибки, - вы должны исключить его в своем DDL.

В конце концов, я всегда выбираю вариант № 1, потому что я думаю, что это приводит к лучшей читабельности, и это заставляет меня явно указывать обработку нуля.

1 голос
/ 02 января 2009

Если я ожидаю строку, я сделаю # 1. Если по какой-либо причине поле не является строкой или изменяет тип, вы по крайней мере узнаете об этом через механизм исключений. (Только не оборачивайте его внутри пробного / пустого улова.)

0 голосов
/ 03 января 2009

мне нравится ?? оператор для проверки нулей (как обсуждено в других сообщениях)

String field = rdr ["field"] As String ?? string.Empty

Это должно работать. Если нет, то уже поздно: P, если вы на самом деле не хотите, чтобы результат был нулевым. Если так, то мне нравится 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...