2

我想使用 datagridview 更新数据库,我已经可以编辑它,但它没有更新到数据库。

我该如何解决?

这是我的代码:

我的表单中有按钮,一个是“编辑”按钮,指的是“编辑数据库”功能,另一个是“确定”按钮,是更新数据到数据库(代码可以在这个找到下面的代码,我在代码中提到它)。

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 的代码似乎是错误的。您正在重新创建 _adapter 变量而没有任何 SELECT 命令....

于 2013-09-17T12:34:10.587 回答