数据未更新到数据库c #datagridview

时间:2013-09-17 12:32:36

标签: c# ms-access datagridview

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

我该如何解决?

这是我的代码:

我的表格中有按钮,其中一个是“编辑”按钮,它是指“EditingDatabase”功能,另一个是“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的数据库表:

enter image description here

谢谢。

感谢您的回答!

1 个答案:

答案 0 :(得分: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 doesn't support named parameters ,在UPDATE语句中,您可以使用简单的问号作为参数占位符,并使用您喜欢的任何名称在AddWithValue中命名参数。但是也支持使用的语法(@Quantity) 重要的一点是:按照它们出现的顺序添加参数。

最后,要更新数据库,唯一需要的命令是

  int numberOfRows = _cmd.ExecuteNonQuery();

如果您希望该代码更新网格,那么ExecuteNonQuery周围的代码似乎是错误的。您正在重新创建_adapter变量而没有任何SELECT命令....