我想使用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
的数据库表:
谢谢。
感谢您的回答!
答案 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命令....