11

データベースからコンボボックスにデータを追加しようとしていました。

        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);
        }

次の例外が発生します。

タイプ 'System.Int32' のオブジェクトをタイプ 'System.String' にキャストできません

ここで何が欠けていますか?

4

5 に答える 5

25

あなたの列には type がありませんstring。どうやらそれはint。だから使用:

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);
}
于 2013-10-25T06:11:53.990 に答える