2014-01-23 2 views
2

Когда колонна Адрес2 пусто, то эта строка:Как я могу безопасно читать строки vals из SQL Server, которые могут быть пустыми?

string address2 = sqlD8aReader.GetString(ADDRESS2_OFFSET); 

... терпит неудачу с:

System.Data.SqlTypes.SqlNullValueException was unhandled by user code 
    HResult=-2146232015 
    Message=Data is Null. This method or property cannot be called on Null values. 
    Source=System.Data 
    StackTrace: 
     at System.Data.SqlClient.SqlBuffer.get_String() 
     at System.Data.SqlClient.SqlDataReader.GetString(Int32 i) 
     at HandheldServer.Models.SQLServerPOCRepository..ctor() in c:\HandheldServer\HandheldServer\Models\SQLServerPOCRepository.cs:line 58 
    InnerException: 

Как я могу безопасно считывать строки, которые могут быть нулевым? Должно ли это быть обработано в SQL как-то (если да, как?) Или должно быть рассмотрено в коде чтения/C#?

ответ

4

Я не знаю, как заполняются ваши данные, но часто, когда мы выполняем запрос, где я работаю, если для определенных операций необходимо иметь пустые строки вместо нуля, мы будем использовать ISNULL(column, '') для столбцов, которые возможно, вернет null, поэтому нашему прикладному уровню не нужно будет беспокоиться о том, является ли значение нулевым, оно просто обрабатывает его как строку.

В противном случае, если вы хотите, чтобы справиться с ней стороны приложения вы можете использовать это:

if(!sqlD8aReader.IsDBNull(ADDRESS2_OFFSET)) 
{ 
    string address2 = sqlD8aReader.GetString(ADDRESS2_OFFSET); 
} 
1

Вы можете добиться того, что в вашем SQL запросе, как:

select * from SomeTable where SomeColumn is not null 

Таким образом, вы не получите это исключение. Но вы также должны проверить, является ли возвращаемое значение нулевым или нет, как сказал akousmata.

3

Быстрый один лайнер будет

string address2 = sqlD8aReader.IsDBNull(ADDRESS2_OFFSET) 
        ? null 
        :sqlD8aReader.GetString(ADDRESS2_OFFSET); 

или как метод расширения:

public static GetStringOrNull(this IDataRecord dr, int i) 
{ 
    return dr.IsDBNull(i) 
      ? null 
      : dr.GetString(i); 
} 

и называют

string address2 = sqlD8aReader.GetStringOrNull(ADDRESS2_OFFSET); 
1

Обращение его со стороны DB

1) Убедитесь, что адрес не NULL при вставке

INSERT INTO t(Address) VALUES(ISNULL(@Address, '')) 

2) Возвращает пустую строку, если NULL

SELECT ISNULL(Address, '') as Address FROM t 

И вы уже имели хорошие ответы от других пользователей sqlReader.IsDBNull

1

Самый простой/Лучшее решение, чтобы сделать ваш SQL запрос напечатайте другие значения вместо нуля. Например, если у меня есть column1, где я, вероятно, получить нулевые значения, я бы назвал этот запрос:

SELECT isnull(column1,0) FROM table 

который печатает 0 вместо нулевых значений

Вместо вызова этого запроса:

SELECT column1 FROM table 

, который печатает нулевые значения и генерирует исключения при возврате данных с помощью C#.

Смежные вопросы