0

ラジオオプションを選択した後、データベース内のアイテムをコンボボックス内に表示したい。これを試したところ、コンボボックスに何も表示されませんでした。親切に助けてください

private void chkDetailsButton_Click(object sender, EventArgs e)
{
    if (radioButtonA.Checked)
    {
        OleDbConnection connect = db.dbConnect();

        try
        {
            connect.Open();
            MessageBox.Show("Opened");
            OleDbCommand command = new OleDbCommand();
            command.Connection = connect;

            command.CommandText = "Select * from Categories";
            DataTable dt = new DataTable();

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                cmbDisplay.Items.Add(dt.Rows[i]["SeatNo"]);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Exception in Database" + ex);
        }
        finally
        {
            connect.Close();
        }
    }
}
4

6 に答える 6

4

try ブロックは次のようになります。

    try
    {
        connect.Open();
        MessageBox.Show("Opened");
        OleDbCommand command = new OleDbCommand();
        command.Connection = connect;

        command.CommandText = "Select * from Categories";
        DataTable dt = new DataTable();

        //Put some data in the datatable!!
        using(OleDbDataReader reader = command.ExecuteReader())
        {
            dt.Load(reader);
        }

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            cmbDisplay.Items.Add(dt.Rows[i]["SeatNo"]);
        }
    }

DataTable にデータを入力する必要があります。

次のことも考慮してください。

        using(OleDbDataReader reader = command.ExecuteReader())
        {
            while(reader.Read())
            {
                cmbDisplay.Items.Add(reader.GetValue(reader.GetOrdinal("SeatNo"));
            }
        }

この方法では、DataTable を使用する必要さえありません。これは、大量のデータ セットに対してより効率的なアプローチです。

余談ですが、Usingの使用を検討することをお勧めします。

    using(OleDbConnection connect = db.dbConnect())
    {
        try
        {
            connect.Open();
            //MessageBox.Show("Opened");
            using(OleDbCommand command = new OleDbCommand())
            {
                command.Connection = connect;
                command.CommandText = "SELECT * FROM Categories";
                using(IDataReader reader = command.ExecuteReader())
                {
                    while(reader.Read())
                    {
                            cmbDisplay.Items.Add(reader.GetValue(reader.GetOrdinal("SeatNo"));
                    }
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("An erorr occured:" + ex);
        }        
    }

これにより、接続、コマンド、およびリーダー オブジェクトが確実に破棄されます。ただし、接続のインスタンスを保持する場合、これは適切ではありません。ただし、コードが using ステートメントを離れるとすぐに閉じられ、破棄されるためです。

于 2012-08-10T09:55:44.103 に答える
3

SQLコマンドによって返されるデータでDataTable dtを埋めることがありません。

于 2012-08-10T09:54:04.760 に答える
1

このコードを試してください - サンプルでは、​​テーブルをデータにバインドせず、テーブルの新しいインスタンスを作成します。

$ private void chkDetailsButton_Click(object sender, EventArgs e) 
{
 if (radioButtonA.Checked)
        {
            OleDbConnection connect = db.dbConnect();

            try
            {
                connect.Open();
                MessageBox.Show("Opened");
                OleDbCommand command = new OleDbCommand();
                command.Connection = connect;

                command.CommandText = "Select * from Categories";
                OleDbDataReader myReader = command.ExecuteReader();
                while (myReader.Read()) 
                {
                    cmbDisplay.Items.Add(myReader["SeatNo"]);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception in Database" + ex);
            }
            finally
            {
                connect.Close();
            }
        }
    }
于 2012-08-10T09:56:15.760 に答える
0

コンボボックスに Datatable を入力できます:

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True");
            SqlDataAdapter da = new SqlDataAdapter("select * from Books",con);
            DataTable dt = new DataTable();
            da.Fill(dt);
            comboBox1.DisplayMember = "Name";
            comboBox1.ValueMember = "ID";
            comboBox1.DataSource = dt;
于 2012-08-10T09:58:30.957 に答える
0

信じられない。:D

DataTable に DB からのデータを正確に入力するのはいつですか? 間に何もない

DataTable dt = new DataTable();

for (int i = 0; i < dt.Rows.Count; i++)

于 2012-08-10T09:56:11.953 に答える
0

アタッチする前にデータセットにデータを入力していませんこれを試してください

     if(radio.checked) 
     {
      try 
        { 
         connect.Open();
         MessageBox.Show("Opened");
         OleDbCommand command = new OleDbCommand();
         command.Connection = connect;
         command.CommandText = "Select * from Categories";

         OleDbDataAdapter db = new OleDbDataAdapter();
         DataSet ds = new DataSet();
         db.SelectCommand = command;
         db.Fill(ds);
         for(int i=0;i<ds.Tables[0].Rows.Count;i++)
         {
           cmbDisplay.Items.Add(ds.Tables[0].Rows[i][0].ToString());      

          }
        cmDisplay.DataBind();

        }
        catch (Exception ex)
        {
            MessageBox.Show("Exception in Database" + ex);
        }
        finally
        {
            connect.Close();
        }
    }
于 2012-08-10T10:11:48.837 に答える