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

Posted

技术标签:

【中文标题】数据未更新到数据库 c# datagridview【英文标题】:Data not updating to the database c# datagridview 【发布时间】:2013-09-17 12:32:36 【问题描述】:

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

我该如何解决?

这是我的代码:

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

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:

谢谢。

感谢您的回答!

【问题讨论】:

很抱歉问你一个愚蠢的问题,但你有没有尝试关闭 ms-access 数据库并更新然后打开它。 没关系,随时问:D。是的,我已经尝试过了。但数据也没有改变。我打开 ms-access 数据库只是为了检查,而不是一直关闭。 numberofRows 的值是多少? 我得到的值是 0 Sir Jaggen,对于 numberOfRows 【参考方案1】:

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 周围的代码会更新网格,则该代码似乎是错误的。您在没有任何 SELECT 命令的情况下重新创建 _adapter 变量....

【讨论】:

好的。我从来不知道参数必须与UPDATE 语句的顺序相同。谢谢。但是,它不起作用史蒂夫。数据库没有更新。我应该用“添加”更改"AddWithvalue" 并添加这个"System.Data.OleDb.OleDbType.Integer"吗? 您是否收到任何错误消息?您是否更改了上面的 UPDATE 语句?如何检查数据库是否被修改? 如果在最后一行 (_cmd.ExecuteNonQuery) 设置断点并执行它,您应该会看到 numberOfRows 的值。如果它不为零,那么您的更新已被应用(并且可能您正在寻找不同的数据库文件)。如果它为零且没有错误,则您的条件 (WHERE ProductCode = ...) 无法识别要更新的任何记录。要使用 OleDbDataAdapter 进行 INSERT/UPDATE/DELETE 操作,您可以 look at this answer 再一次,您的代码没有按正确的顺序添加参数;这样,在 ProductCode 的参数处将被赋予为 Price 设置的值,当然不会找到要更新的记录 啊,是的,史蒂夫先生,它已经在工作了!只是因为我把 ProductCode 的 cmdUpdate 放在 executeReader 之前 --" 再次感谢先生!

以上是关于数据未更新到数据库 c# datagridview的主要内容,如果未能解决你的问题,请参考以下文章

c#在datagridview中删除指定行并更新到数据库

如何使用 C# 将数据表中的值更新到 datagridview?

DataGridView 数据源未更新

c# datagridview 滚动条问题

在c#中编辑datagridview后如何更新我的数据库

C# winform 如何用datagridview增、删、改数据