2

datagridview を使用してデータベースを更新したかったのですが、既に編集できますが、データベースに更新されませんでした。

どうすれば修正できますか?

これが私のコードです:

私のフォームにはボタンがあります.1つは「EditingDatabase」関数を参照する「編集」ボタンで、もう1つはデータベースにデータを更新する「OK」ボタンです(コードはこれにあります以下のコードでは、コードで言及しています)。

private void EditingDatabase(object sender, EventArgs e)
        {
            DataTable _dt = (DataTable)dataGridView1.DataSource;

            if (_dt.DefaultView.Count > 0)
            {
                int rowNum = dataGridView1.CurrentRow.Index;
                int productCode = Convert.ToInt32(_dt.DefaultView[rowNum]["ProductCode"]);
                int quantity = Convert.ToInt32(_dt.DefaultView[rowNum]["Quantity"]);
                int price = Convert.ToInt32(_dt.DefaultView[rowNum]["Price"]);

                using (OleDbConnection conn = new OleDbConnection(connectionString))
                {
                    string commandSelect = "SELECT [Quantity], [Price] FROM [Table] WHERE [ProductCode] = @ProductCode";
                    string commandUpdate = "UPDATE [Table] SET [Quantity] = @Quantity, [Price] = @Price WHERE [ProductCode] = @ProductCode";

                    conn.Open();

                    using (OleDbCommand _cmdSelect = new OleDbCommand(commandSelect, conn))
                    using (OleDbCommand _cmdUpdate = new OleDbCommand(commandUpdate, conn))
                    {
                        _cmdSelect.Parameters.Add("@ProductCode", System.Data.OleDb.OleDbType.Integer);
                        _cmdSelect.Parameters["@ProductCode"].Value = productCode;

                        _cmdUpdate.Parameters.Add("ProductCode", System.Data.OleDb.OleDbType.Integer);

                        _cmdUpdate.Parameters.Add("@Quantity", System.Data.OleDb.OleDbType.Integer);

                        _cmdUpdate.Parameters.Add("@Price", System.Data.OleDb.OleDbType.Integer);

                        using (OleDbDataReader dReader = _cmdSelect.ExecuteReader())
                        {
                            while (dReader.Read())
                            {
                                _cmdUpdate.Parameters["@ProductCode"].Value = productCode;
                                _cmdUpdate.Parameters["@Quantity"].Value = quantity;
                                _cmdUpdate.Parameters["@Price"].Value = price;

                                int numberOfRows = _cmdUpdate.ExecuteNonQuery();
                            }

                            dReader.Close();
                        }
                    }

                    conn.Close();
                }

                if (_choice.comboBox1.Text == "English") // THIS IS WHERE THE "OK" BUTTON FUNCTION RUNS
                {
                    System.Media.SoundPlayer _sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
                    _sounds.Play();
                    MessageBox.Show("Updated Successfully!", "Updated");

                    ShowButtons(sender, e);

                    DisableColumnEdited(sender, e);
                }
            }

            else
            {
                if (_choice.comboBox1.Text == "English")
                {
                    System.Media.SoundPlayer _sounds = new System.Media.SoundPlayer(@"C:\Windows\Media\Windows Exclamation.wav");
                    _sounds.Play();
                    MessageBox.Show("There is no Data in the Selected Row!", "Error");
                    return;
                }
            }
        }

編集済み

以下は、プログラム内の私の datagridview のスクリーンショットです。datagridview は、次の名前のデータベース テーブルに接続されていますTable

ここに画像の説明を入力

ありがとうございました。

あなたの答えに感謝します!

4

1 に答える 1

2

UPDATEステートメントの構文が間違っています。そのはず

   string query = "UPDATE [Table] SET [Quantity] = @Quantity, [Price] = @Price " + 
                  "WHERE [ProductCode] = @ProductCode";

また、OleDb を使用しており、OleDb では、コマンド ステートメントに表示されるのと同じ順序でパラメーターを追加する必要があるため、次のように記述する必要があります。

_cmd.Parameters.AddWithValue("@Quantity", quantity);
_cmd.Parameters.AddWithValue("@Price", price);
_cmd.Parameters.AddWithValue("@ProductCode", productCode);

OleDb は名前付きパラメーターをサポートしていません。UPDATE ステートメントでは、単純な疑問符をパラメーター プレースホルダーとして使用し、AddWithValue で任意の名前でパラメーターに名前を付けることができます。ただし、使用される構文 (@Quantity) もサポートされています。
重要な点は、パラメータを表示順に追加することです。

最後に、データベースを更新するために必要な唯一のコマンドは

  int numberOfRows = _cmd.ExecuteNonQuery();

そのコードがグリッドを更新すると予想される場合、ExecuteNonQuery の周りのコードは間違っているように見えます。SELECT コマンドを使用せずに _adapter 変数を再作成しています....

于 2013-09-17T12:34:10.587 に答える