2011-11-03 83 views
8
int topID = 0; 
string TopIDQuery = "Select TopID from tbl_Organisation where [email protected]"; 

paramet[0] = new MySqlParameter("@OrgID", MySqlDbType.Int32); 
paramet[0].Value = OrgID; 

reader = server.ExecuteReader(CommandType.Text, TopIDQuery, paramet); 

while (reader.Read()) 
{ 
    topID = Convert.ToInt32(reader["TopID"]); 
} 

reader.Close(); 

我讀從表中,topIDTopID爲空我想離開topID爲0,但因爲它是null,則拋出一個錯誤,怎麼讀我可以處理這個錯誤時,topID爲null對象不能從DBNull轉換爲其他類型。錯誤當一個空值由讀者

回答

6

更改您的閱讀代碼:

while (reader.Read()) 
{ 
    if(reader.IsDBNull(reader.GetOrdinal("TopID"))) 
     topID = 0; 
    else 
     topID = Convert.ToInt32(reader["TopID"]); 
} 
+0

CS1502:'System.Data.Common.DbDataReader.IsDBNull(int)'的最佳重載方法匹配具有一些無效參數相同的錯誤 – Mark

+0

@Mark:oops,對不起 - 更新我的答案 –

4

呼叫IsDBNull()對讀者試圖將其轉換之前檢查柱:

using (reader = server.ExecuteReader(CommandType.Text, TopIDQuery, paramet)) 
    { 
     while (reader.Read()) 
     { 
      var column = reader.GetOrdinal("TopID"); 

      if (!reader.IsDBNull(column)) 
       topID = Convert.ToInt32(reader[column]); 
      } 
     } 
    } 

或者,比較反對DBNull.Value

var value = reader["TopID"]; 

    if (value != DBNull.Value) 
    { 
     topID = Convert.ToInt32(value); 
    } 
+0

'System.Data.Common.DbDataReader.IsDBNull(int)'的最佳重載方法匹配有一些無效參數錯誤如何解決它 – Mark

+0

對不起,它需要一個列ID,忘記了:-)更新,... –

1

使用測試:

int columnNr = reader.GetOrdinal("TopID"); 
if (!reader.IsDBNull(columnNr)) { 
    topID = reader.GetInt32(columnNr); 
} 
+0

如果您確定列號循環,那麼代碼會更快一些。 –

1

的問題是,您要設置INT使用空,而不是在讀。你可以這樣做,如果你正試圖把在一個爲空設置一個備用的值:

topID = Convert.ToInt32(reader["TopID"]) ?? 0; 

另一種方法是,你可以通過初始化topID這樣使用可空整數:

int? topID = 0 

但是這樣做仍然需要在其他地方檢查null,以及其他一些必須處理的事情,因此我建議在您的值集中使用雙重問號,如我先展示的那樣。

+0

運營商'??'不能應用於類型'int'和'int'的操作數 –

+0

正確,但可以在reader [「TopId」]能夠返回空值時使用它,因爲Convert.ToInt32不會拋出空引用,而會提供空輸出,這對他正在設置的topID無效。 – Nikkoli

0

在嘗試檢索它之前,您需要檢查值是否爲DBNull。此外,我建議使用GetInt32()而不是Convert.ToInt32(),因爲已經聲明GetInt32()的內部優化可能會改變,它會比使用Convert.ToInt32()更快。我很久以前就知道了這一點,沒有參考文章讓你看。當時,我得知這個GetInt32()內部用Convert.ToInt32()

while(reader.Read()) { 
    int TopIDIndex = reader.GetOrdinal("TopID"); 
    topID = reader.IsDBNull(TopIDIndex) 
     ? 0 
     : reader.GetInt32(TopIDIndex); 
} 
0

我喜歡用DataTable而不是DataReader。我討厭重複樣板,所以增加了一些擴展方法向DataRow類來封裝喪氣邏輯,併爲更多可讀代碼:

DataTable dt = ExecStoredProcedure() ; 
foreach (DataRow dr in dt) 
{ 
    int  id   = dr.CastAsInt("id") ; 
    dateTime? dtLastUpdated = dr.CastAsDateTimeNullable("last_update_date") ; 
    int?  col3   = dr.CastASIntNullable(3) ; 
} 

這裏用於從DataRow列值的向下轉換到一個int代碼/ int?

#region downcast to int 

public static int CastAsInt(this DataRow row , int index) 
{ 
    return toInt(row[index]) ; 
} 
public static int CastAsInt(this DataRow row , string columnName) 
{ 
    return toInt(row[columnName]) ; 
} 

public static int? CastAsIntNullable(this DataRow row , int index) 
{ 
    return toIntNullable(row[index]); 
} 
public static int? CastAsIntNullable(this DataRow row , string columnName) 
{ 
    return toIntNullable(row[columnName]) ; 
} 

#region conversion helpers 

private static int toInt(object o) 
{ 
    int value = (int)o; 
    return value; 
} 

private static int? toIntNullable(object o) 
{ 
    bool hasValue = !(o is DBNull); 
    int? value = (hasValue ? (int?) o : (int?) null) ; 
    return value; 
} 

#endregion conversion helpers 

#endregion downcast to int 

我肯定掛類似的擴展方法關閉DataReader的將是相當簡單的。

0

這裏是我們自動生成從MS Access數據庫中的任何ID上的任何登記表

void Number() 
{ 
    con.Open(); 
    int id; 
    cmd = new OleDbCommand("select max(ID) from Entry", con); 
    string value = (cmd.ExecuteScalar().ToString()); 
    string max; 
    if (value != null) 
    {  
     max = "0"+value; 
     id = Convert.ToInt32(max); 
     lblNumber.Text = "Acronym of Reg form like for Emp for Employee" 
         + Convert.ToString((id + 1)); 

    } 
    con.Close(); 
} 
0

對你的讀者使用通用的擴展方法的頁面加載代碼(見類似SO question

topID = reader.GetFieldValueOrDefaultIfDBNull<Int32>("TopID"); 

在您的閱讀器類(MySql,Sql,Oracle等)上實現此擴展方法

public static T GetFieldValueOrDefaultIfDBNull<T>(this SqlDataReader reader, string indexName) 
{ 
    if (reader.IsDBNull(reader.GetOrdinal(indexName))) 
    { 
     return default(T); // returns the default value for the type 
    } 
    else 
    { 
     return reader.GetFieldValue<T>(reader.GetOrdinal(indexName)); 
    } 
} 
相關問題