2013-10-25 27 views
6

データベースからacomboboxにデータを追加しようとしました。タイプ 'System.Int32'のオブジェクトをDataReader.GetString()で 'System.String'と入力するとキャストできません

型 '可能System.Int32' のオブジェクトをキャストすることができませんが、私がここで行方不明です何が可能System.String "

を入力する:

 try 
     { 
      SqlCeCommand com = new SqlCeCommand("select * from Category_Master", con); 
      SqlCeDataReader dr = com.ExecuteReader(); 
      while(dr.Read()){ 
       string name = dr.GetString(1); 
       cmbProductCategory.Items.Add(name); 
      } 
     } 
     catch(Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

は、私は次の例外を取得しますか?

+4

何の例外がありますか? 'Convertを使ってみてください。'value.ToString()'ではなくToString(value)です。 – Ravi

+0

'System.Int32'タイプのオブジェクトをキャストして 'System.String'と入力できません。 – Kamal

+0

dr.GetString(1).ToString()に変更しましたが、エラーは同じです。 – Kamal

答えて

15

明らかに、あなたのカラムのタイプはstringではありません。明らかにそれはintです。だから、使用します。変更内容をデータベースに入力するために、よりroubstをする必要があります

dr.getInt32(1).ToString() 

あるいは

dr.GetValue(1).ToString() 

を。

一般的なアドバイスのいくつかの並べ替えとして、私は、少なくとも従うことを試してみてください。

  • はあなたが必要とするものだけを選択します。これは主にパフォーマンスの理由があります。は、カラム名を明示的に指定する必要があるため、スキーマを互換性のない方法で変更した場合に少なくとも賢明なエラーが発生する理由があります。
  • 名前を使用してフィールドにアクセスします(例:

    dr.GetGuid(dr.GetOrdinal("id")) 
    

    このような事がまたうまく拡張メソッドによって解決することができます。

    public T GetFieldValue<T>(this DbDataReader reader, string columnName) 
    { 
        return reader.GetFieldValue<T>(reader.GetOrdinal(columnName)); 
    } 
    

サイドノート:あなたのコード内のスタックトレース(または少なくともことわざラインを含むを例外はあなたを助けようとしている他の人に役立つことがあります。あなたは野生から見ることができるように、犯人が何であるかを推測します。私の推測では、スタックトレースは次のようにやや見えることになります:

SqlDataReader.GetString 
YourCode.YourMethod 

とそのGetStringは、多かれ少なかれ、このようになります。

public string GetString(int index) 
{ 
    return (string) GetValue(index); 
} 
+0

@AndreasNiedermairはいそれは_zero-based_です。そのため、 'GetString(1)'と言うと、テーブルの2番目の列を検索します。 –

+0

はい、最初の列はIDで、2番目の列はnvarcharのCategoryNameです – Kamal

+0

私も同じことをしましたが、何も変わりませんでした。 – Kamal

1

あなたのコラムはint型を持っていないようです。 このようなことを避けるには、インデックスの代わりに列名を使用できます。

try 
{ 
    SqlCeCommand com = new SqlCeCommand("select * from Category_Master", con); 
    SqlCeDataReader dr = com.ExecuteReader(); 
    while(dr.Read()){ 
     string name = dr["yourColumnName"].ToString(); 
     cmbProductCategory.Items.Add(name); 
    } 
} 
catch(Exception ex) 
{ 
    System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 
+0

理由!! 'GetString'、' GetInt32'のような型付けされたものを行うことができます。文字列インデクサーを使って 'object'(型なし)の値にアクセスすることができます –

+0

正しいですが、アドレッシング。 – Koen

+0

"dr。[" – Kamal

0

[OK]をクリックします。その

 try 
     { 
      SqlCeCommand com = new SqlCeCommand("select CategoryName from Category_Master", con); 
      SqlCeDataReader dr = com.ExecuteReader(); 
      while(dr.Read()){ 
       string name = dr.GetString(0); 
       cmbProductCategory.Items.Add(name); 
      } 
     } 
     catch(Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

私は単一の値にSqlCommandオブジェクトを変更し、0にdr.getstringの列番号を()に変更.. ....ここ

コードで解決..それが働きました。お手伝いいただきありがとうございます。私は私のプロジェクトでは半分にすぎないので、もっと期待しています。

関連する問題