2012-05-04 3 views
1

Я использую SqlDataReader для получения значений из таблицы SQL и присваивания их соответствующим переменным. Но в моей таблице int и double столбцы типа имеют нулевые значения. Поэтому, когда я пытаюсь прочитать nullint и назначить его переменной int, он сработает.Обработка нулевых типов из SQL в C#

Вот как значения назначаются на:

public int ID { get; set; } 
public int Map { get; set; } 
public int TypeID { get; set; } 

И это, где они читают:

while (objSqlDataReader.Read()) 
{ 
    data= new data(); 
    emissiondata.ID = (int)objSqlDataReader["EFID"]; 
    emissiondata.Map = (int)objSqlDataReader["EFMappingID"]; 
    emissiondata.TypeID =(SqlInt32)objSqlDataReader["MobileTypeID"]; 

Так что, если любой из них null, даже когда я отлаживая его, он выходит из строя и не продолжается. Как обрабатывать значения null в SQL и как назначить пустые значения для моего int, если это null?

ответ

0

Вы можете сделать это в самом запросе. В Oracle функция NVL(). Похоже, вы используете MS SQL Server, который использует:

ISNULL(YOUR_FIELD,0) 

Использование и синтаксис для других СУБД здесь: http://www.w3schools.com/sql/sql_isnull.asp

+0

будет ли это назначать мою переменную пустой или как 0? –

+0

Я искал, чтобы он был пустым, если он равен нулю –

+0

@Tanny Fgh, я не уверен, какой язык программирования вы используете, но вы, как правило, не можете передать null в примитив 'int'. – Marc

1

Таким образом, чтобы найти ответ, я смотрю на документацию для вашего класса 're talk about: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx Существует метод IsDBNull. Не имея C# вокруг, это должно работать:

while (objSqlDataReader.Read()) 
{ 
    data= new data(); 
    if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("EFID"))) 
    { 
     emissiondata.ID = (int)objSqlDataReader["EFID"]; 
    } else { 
     // Whatever you want to do when it is null 
    } 
    if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("EFMappingID"))) 
    { 
     emissiondata.Map = (int)objSqlDataReader["EFMappingID"]; 
    } else { 
     // Whatever you want to do when it is null 
    } 
    if (!objSqlDataReader.IsDBNull(objSqlDataReader.GetOrdinal("MobileTypeID"))) 
    { 
     emissiondata.TypeID = (int)objSqlDataReader["MobileTypeID"]; 
    } else { 
     // Whatever you want to do when it is null 
    } 
} 
1

Не может проверить это сейчас, но вы можете попробовать с int?, в обнуляемом int. Это сокращение от Nullable<Int32>. Если objSqlDataReader может быть переведено на int?, измените свои поля на int? и добавьте дополнительную логику в средство настройки свойств, если вам нужно что-то сделать, когда значение равно null.

1

DBNull.Value работает на DataTable строк, я не уверен, что с SqlDataReader:

bool isNull = objSqlDataReader.GetOrdinal("EFID") == DBNull.Value; 

При использовании SqlDataReader-х GetSqlInt32,GetSqlDateTime, etc, например, они с нулевым знают вне коробки.

Вместо распаковка:

emissiondata.ID = (int)objSqlDataReader["EFID"]; 

Вы можете сделать это вместо того, чтобы:

SqlInt32 emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal); 

Затем вы можете проверить на нуль непосредственно:

if (emissionId.IsNull) ... 

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

int emissionIdOrdinal = rdr.GetOrdinal("EFID"); 

Но если вы действительно хотите, C# 's нуль, вы делаете вспомогательную функцию для этого вместо:

public static int? ToNullable(this SqlInt32 value) 
{ 
    return value.IsNull ? (int?) null : value.Value; 
} 

Чтобы получить доступ к нему с обнуляемым переменным:

int? emissionId = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable(); 

Теперь вы можете проверить нуль непосредственно:

if (emissionId == null) 

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

public int? ID { get; set; } 
public int? Map { get; set; } 
public int? TypeID { get; set; } 

Окончательный код:

data= new data(); 
emissiondata.ID = objSqlDataReader.GetSqlInt32(emissionIdOrdinal).ToNullable(); 
emissiondata.Map = objSqlDataReader.GetSqlInt32(emissionMapOrdinal).ToNullable(); 
0

Я понимаю, что это старое, но если вам нужен этот ответ после 2016-07-14: Когда SQL Type является int, null Использовать int? как тип данных.

int? является «nullable» int, поэтому, когда SQL возвращает NULL для столбца, значение свойства получает значение null.

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