数据未更新到数据库 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的主要内容,如果未能解决你的问题,请参考以下文章