2016-08-16 4 views
0

コンボボックスを追加しようとしましたが、すべての製品名を取得できましたが残念ながら私はいくつかのチュートリアルに従い、このようになります。C#アクセスでコンボボックスを初期化する

void fillCombo() 
    { 
     try 
     { 
      con.Open(); 
      OleDbCommand command = new OleDbCommand("Select * from IblInventory"); 
      command.Connection = con; 
      OleDbDataReader reader = command.ExecuteReader(); 

      while (reader.Read()) 
      { 
       String product = reader.GetString("ProductName"); // << invalid argument 
       cmbProduct.Items.Add(product); 
      } 
      con.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

おそらく何が原因でしょうか?

+0

エラーを指定します。「エラー」とは何も意味しません。 – 3615

+0

私は4列あります。 '' reader.GetString() ''の文法で正しい構文を見つけることができません。そのために私はプログラムを実行できません。 –

+1

"コンボボックスを追加しようとしていましたが...理由は何だろう? "この質問はあまりにも曖昧です。問題の内容を詳しく記述してください。あなたの期待は何でしたか?何が効いていないのですか?あなたが何らかのエラーメッセージを持っているなら - >彼らは何ですか? –

答えて

3

OleDbDataReader.GetStringのドキュメントでは、メソッドで必要な引数が、返されたレコードの列の位置をその名前ではなく表す整数であることがわかります。

(正しい)列名を使用する場合は、迂回してGetOrdinalメソッドを使用して、名前が付いた列の位置を取得する必要があります。

while (reader.Read()) 
{ 
    int pos = reader.GetOrdinal("ProductName"); 
    String product = reader.GetString(pos); 
    cmbProduct.Items.Add(product); 
} 

別の例として、あなたの状況と実質的に同じで、MSDN上のドキュメントページで見つけることができる程度OleDbDataReader.GetOrdinal

また、あなたはあなたが隠れてコードを記述することができますextension methodを書くのが一般的です名前と位置の間のマッピングの詳細。あなたはちょうどあなたが以下のコードを参照してください、それは私のプロジェクト まずで働いている

string product = reader.GetString("ProductName"); 
0

を呼び出してデータテーブルにデータを埋めることができます

public static class ReaderExtensions 
{ 
    public string GetString(this OleDbDataReader reader, string colName) 
    { 
     string result = ""; 
     if(!string.IsNullOrEmpty(colName)) 
     { 
      int pos = reader.GetOrdinal(colName); 
      result = reader.GetString(pos); 
     } 
     return result; 
    } 
    ... other extensions for Int, Decimals, DateTime etc... 
} 
代わりに、このクラスで今

とアクセス可能と静的クラスが必要です今

DataTable results = new DataTable(); 

using(OleDbConnection conn = new OleDbConnection(connString)) 
{ 
    OleDbCommand cmd = new OleDbCommand("Select * from IblInventory", conn); 

    conn.Open(); 

    OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 

    adapter.Fill(results); 
} 

cmbProduct.DataSource = results ; 
cmbProduct.DisplayMember = "ProductName"; 
cmbProduct.ValueMember = "Id feild of IblInventory table"; 
関連する問題