2016-01-21 37 views
4

我使用SqlDataReader對象從SQL服務器獲取數據2012數據庫中的int字段:SqlDataReader對象返回的空白而不是空的

SqlConnection connection = (SqlConnection)_db.Database.GetDbConnection(); 
await connection.OpenAsync(); 
SqlCommand command = new SqlCommand("dbo.[sp_MyStoredPrc] @InputId=1", connection); 
var reader = await command.ExecuteReaderAsync(); 

if (reader.HasRows) 
{ 
    while (reader.Read()) 
    { 
     int? var1 = (int?)reader["Column1Name"]; 
    } 
} 

當從數據庫中讀取一個NULL int場, reader["Column1Name"]是空白,因此代碼在運行時拋出InvalidCastException。

我已經試過

reader.GetInt32(reader.GetOrdinal("Column1Name")) 

但這拋出System.Data.SqlTypes.SqlNullValueException。

我也曾嘗試

reader.GetSqlInt32(reader.GetOrdinal("Column1Name")) 

返回null,但類型是SqlInt32,而不是像int?我想。

我落得這樣做

if (!reader.IsDBNull(reader.GetOrdinal("Column1Name"))) 
    int? var1 = (int?)reader["Column1Name"]; 

其中工程。

問題:

  1. 是不是還有比調用IsDBNull方法更簡單的方法?

  2. 爲什麼reader["Column1Name"]返回空白而不是null如果db值爲NULL且字段爲int

+0

我不確定,但嘗試使用Convert.ToInt32(reader [「Column1Name」]); – SergeyAn

+0

我得到一個異常,因爲Reader [「Column1Name」]爲空 – devc2

+0

您確定db值爲空嗎?它可以是空的,但並不意味着它是空的。否則,沒有簡單的方法來處理它,而是檢查空值。 – SergeyAn

回答

4

爲什麼reader["Column1Name"]回報空白代替NULL,如果分貝值爲null並且字段是一個int

實際上,如果數據庫值爲NULL,則reader["Column1Name"]返回DBNull.Value。 (在Visual Studio調試器中,該值顯示爲空,因爲DBNull.ToString()返回空字符串。)您不能使用cast操作符將DBNull.Value直接投射到int?

是不是有一種簡單的方法,然後調用IsDBNull方法?

是,使用as運營商,而不是投:

int? var1 = reader["Column1Name"] as int?; 

因爲DBNull.Value不是int,該as運算符返回null

0

C#不能將字符串轉換爲int?使用(int?)。最安全的方法是使用條件運算符來檢查null,然後手動將該值設置爲null。

//Get the column index to prevent calling GetOrdinal twice 
int COLUMNNAME1 = reader.GetOrdinal("ColumnName1"); 

while (reader.Read()) 
{ 
    int? var1 = reader.IsDBNull(COLUMNNAME1) ? null : reader.GetInt32(COLUMNNAME1); 
} 

同樣,如果您有非空數據類型,您可以檢查它們爲空並將它們設置爲它們的默認值。

int STRINGCOLUMN = reader.GetOrdinal("StringColumn"); 
int INTCOLUMN = reader.GetOrdinal("IntColumn"); 
int DATECOLUMN = reader.GetOrdinal("DateColumn"); 
int BOOLCOLUMN = reader.GetOrdinal("BoolColumn"); 

while (reader.Read()) 
{ 
    string var1 = reader.IsDBNull(STRINGCOLUMN) ? "" : reader.GetString(STRINGCOLUMN); 
    int var2 = reader.IsDBNull(INTCOLUMN) ? 0 : reader.GetInt32(INTCOLUMN); 
    DateTime var3 = reader.IsDBNull(DATECOLUMN) ? DateTime.MinValue : reader.GetDateTime(DATECOLUMN); 
    bool var4 = reader.IsDBNull(BOOLCOLUMN) ? false : reader.GetBoolean(BOOLCOLUMN); 
}