2013-04-29 65 views
4

我試圖從數據庫中獲取數據在GridView中顯示在文本框中單擊時,它適用於沒有空數據的行,但由於我的int列有一些空值我的GetInt32方法不斷返回「數據爲空。此方法或屬性不能在空值上調用。」如何使Sqlcommand接受空值

有沒有簡單的方法來解決或解決此問題?我用另一種方法替換GetInt32嗎?如果可能的話,我希望空白的數據在文本框中顯示空白/空白。這是我的代碼,如果您有任何建議,謝謝。

public ArrayList GetAllPersonnel(int WorkerID) { 
     using (var connection = new SqlConnection(connectionString)) { 
      connection.Open(); 
      String query = "Select * FROM Personnel WHERE WorkerID = " + WorkerID; 

      using (var command = new SqlCommand(query, connection)) { 
       var reader = command.ExecuteReader(); 
       var list = new ArrayList(); 
       while (reader.Read()) { 
        String firstname = reader.GetString(1); 
        String lastname = reader.GetString(2); 
        String occupation = reader.GetString(3); 
        String deployment = reader.GetString(4); 
        int disasterid = reader.GetInt32(5); 
        String location = reader.GetString(6); 
        int deployedhours = reader.GetInt32(7); 
        int resthours = reader.GetInt32(8); 

        list.Add(firstname); 
        list.Add(lastname); 
        list.Add(occupation); 
        list.Add(deployment); 
        list.Add(disasterid); 
        list.Add(location); 
        list.Add(deployedhours); 
        list.Add(resthours); 
       } 
       connection.Close(); 
       reader.Close(); 
       return list; 
      } 
     } 
    } 
+0

歡迎來到堆棧溢出,未來我。 – 2013-04-29 13:07:40

回答

2

OK,所以你實際上是說,你一切都顯示應該是string型,這是很好的,我只是做這一點,因爲你說你想甚至整數顯示爲空字符串。那麼這個代碼呢?現在

String firstname = reader.GetString(1); 
String lastname = reader.GetString(2); 
String occupation = reader.GetString(3); 
String deployment = reader.GetString(4); 
String disasterid = reader.IsDBNull(5) ? string.Empty : reader.GetString(5); 
String location = reader.GetString(6); 
String deployedhours = reader.IsDBNull(7) ? string.Empty : reader.GetString(7); 
String resthours = reader.IsDBNull(8) ? string.Empty : reader.GetString(8); 

list.Add(firstname); 
list.Add(lastname); 
list.Add(occupation); 
list.Add(deployment); 
list.Add(disasterid); 
list.Add(location); 
list.Add(deployedhours); 
list.Add(resthours); 

,我之所以說,你想作爲一個字符串是因爲對於int的默認值是0這將無法滿足空文本框要求利用一切。

+0

是的,我想這就是我的目標,但現在我得到一個無法轉換'System.Int32'類型的對象來鍵入'System.String'錯誤。你知道我必須解決什麼問題嗎?謝謝 – 2013-04-29 13:39:23

+0

@NickV,在哪一行?那個時候'reader'中的字段的價值是什麼?因爲我們可以走不同的路線。 – 2013-04-29 13:51:12

+0

我設法解決它,謝謝你的幫助! – 2013-04-29 13:59:30

4

您應該使用SqlDataReader的

int resthours = (!reader.IsDBNull(8) ? reader.GetInt32(8) : 0); 

,或者更直接

list.Add((!reader.IsDBNull(8) ? reader.GetInt32(8).ToString(): string.Empty)); 

說,我注意到,您使用字符串連接生成SQL命令的IsDBNull方法文本來檢索記錄。請不要這樣做。這是非常危險的,可能會導致Sql Injection

String query = "Select * FROM Personnel WHERE WorkerID = @wkID"; 
using (var command = new SqlCommand(query, connection)) 
{ 
    command.Parameters.AddWithValue("@wkID", WorkerID); 
    var reader = command.ExecuteReader(); 
    .... 
+0

感謝您的快速回復!我修正了字符串連接,並且沒有任何問題,但是當我用這些行替換'int rest hours'和list.add(resthours)時我得到的結論參數1:無法從'int'轉換爲'string'。有什麼我失蹤? – 2013-04-29 13:34:05

+0

是的,這工作完美,謝謝! – 2013-04-29 13:59:05

1

您至少有兩種方法來排序了這一點

  • 修改SQL選擇零或任何你認爲合適的空值的地方。這將確保您在整數列中始終有一個整數值。它可以以下面的方式

    選擇ISNULL作爲的ColumnName從xxx

  • 始終從讀取器讀取對​​象並檢查它是否爲空或不是(的ColumnName,0)來完成。如果它爲空,則將其替換爲合適的值。