2015-07-20 37 views
0

我正在尋找一個ListBox的ArrayList中的數據移動,但它給錯誤。 錯誤:在SqlDataReader上調用GetString給我一個InvalidCastException

「」類型的未處理的異常在System.Data.dll中其他信息發生 :您不能轉換類型的 對象「System.Int32」的類型「System.String 」。

這發生在行:fill_arry[i] = objReader.GetString(1);

代碼:

public void Fill_List(ArrayList fill_arry) 
{ 
    SqlDataReader objReader; 
    SqlCommand objcmd =null; 

    int i = 0; 

    vsql = "SELECT [NOME] As Identificador,[RGP],[NOME],[ENDERECO],[CIDADE],[ESTADO],[TELEFONE],[CELULAR] FROM pescador"; 

    if (this.Conectar()) 
    { 
     try 
     { 
      objcmd = new SqlCommand(vsql, objCon); 
      objReader = objcmd.ExecuteReader(); 

      while (objReader.Read()) 
      { 
       fill_arry[i] = objReader.GetString(1); 
      } 
     } 
     catch (SqlException erro) 
     { 
      throw erro; 
     } 
     finally 
     { 
      this.Desconectar(); 
     } 
    } 
} 
+3

我不會」推薦使用ArrayList,而不是使用普通List。您不必從對象中強制轉換:http://stackoverflow.com/a/2309699/1661209 ArrayList在C#中已被棄用。 – Max

+0

「RGP」列的類型是什麼?看起來像是數字類型。 –

+0

你能舉個例子嗎? – user3056183

回答

3

編輯:

不,我需要得到諾姆

所以[諾姆]是所需的字段,c焊割:

fill_arry.Add(objReader.GetString(1)); 

要:

fill_arry.Add(objReader.GetString(0)); 

注:由於sstan在他的回答中寫道下來,你檢索RGP] [列值,這是你想要的嗎?既然它是一個int,你將不得不轉換。如果您想獲得[NOME],而不是更改10,因爲索引從零開始。

使用普通列表優於舊ArrayList。使用List而不是ArrayList不需要投射。 ArrayList存儲對象引用。 你最終會像一個函數:

public void Fill_List(List<string> fill_arry) 
{ 
    SqlDataReader objReader; 
    SqlCommand objcmd =null; 

    int i = 0; 

    vsql = "SELECT [NOME] As Identificador,[RGP],[NOME],[ENDERECO],[CIDADE],[ESTADO],[TELEFONE],[CELULAR] FROM pescador"; 

    if (this.Conectar()) 
    { 
     try 
     { 
      objcmd = new SqlCommand(vsql, objCon); 
      objReader = objcmd.ExecuteReader(); 

      while (objReader.Read()) 
      { 
       //The value is added to List<string> fill_arry here. 
       fill_arry.Add(objReader.GetString(1)); 
      } 
     } 
     catch (SqlException erro) 
     { 
      throw erro; 
     } 
     finally 
     { 
      this.Desconectar(); 
     } 
    } 
} 

方法應該被稱爲是這樣的:

List<string> strList = new List<string>(); 
Fill_List(strList); 

參考下面的回答,知道,爲什麼你不應該使用ArrayList,而不是一個列表。

從回答簡短報價:

的ArrayList屬於天,C#語言沒有仿製藥。這是 棄用贊成列表。除非您必須與使用它的舊的 API接口,否則不應在目標.NET> = 2.0的新代碼 中使用ArrayList。

SO answer

+0

繼續發生同樣的錯誤。 – user3056183

+0

在下面的行? 'fill_arry.Add(objReader.GetString(1));'?該索引從0開始,所以'GetString(1)'會給你從[RGP]列的值是否是所需的? – Max

+1

我認爲這個答案更適合於拋棄ArrayList而不是解決他的問題。 ArrayList採用任何類型,因此通過將ArrayList更改爲其他內容,不會影響轉換錯誤。我認爲的另一個答案解決了這個問題。刪除這個答案? – Thraka

3

使用List<T>而不是ArrayList是,因爲別人都這麼說,更好的做法。但這不是你錯誤的原因。

錯誤的原因是這樣的:objReader.GetString(1)

這是試圖獲取RPG列的值,就好像它是一個string,實際上,根據錯誤,它是一個int

要擺脫錯誤,但仍然將值作爲字符串獲取,請將其更改爲objReader.GetInt32(1).ToString()

編輯:嗯,很明顯,你想[NOME],不[RGP] :)

這本來是很好的指定。 SqlDataReader上的索引開始於0。因此要獲得NOME,你需要把它取爲:

objReader.GetString(0); 

或者,更好的是,如果你想避免讓索引錯誤,爲什麼不這樣說:

(string)objReader["Identificador"]; // named parameter instead of an index, yay! 
相關問題