OleDb操作Access数据库执行UPDATE无报错但字段未更新问题排查
问题根因
OLE DB 驱动对参数的绑定规则是按传入顺序匹配,不识别参数名称。
你编写的UPDATE语句参数出现顺序为:UPDATE [Rooms] SET Person = @Full_Name WHERE ID = ?
第一个占位符对应@Full_Name,第二个占位符对应ID筛选值。但你添加参数的顺序是先传入idPlus2、再传入Full_Name,顺序完全颠倒,实际执行的逻辑等价于:UPDATE [Rooms] SET Person = [idPlus2的数值] WHERE ID = [Full_Name的字符串]
既匹配不到符合条件的记录,也不会抛出语法异常,就会出现字段始终为空的现象。
解决方法
调换参数添加顺序即可,同时可以补充下面的优化点避免其他潜在问题:
- 接收
ExecuteNonQuery()的返回值,判断受影响行数,可快速确认是否有记录被成功更新 - 给
Full_Name设置初始空值,避免Guests表无匹配记录时变量未初始化的问题 - 使用
using块自动释放数据库相关对象资源,无需手动调用Close() - 删除未使用的
OleDbDataAdapter对象声明
修正后代码
private string connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\....mdb"; //Path anonymous string Full_Name = string.Empty; [Obsolete] private void customButton1_Click(object sender, EventArgs e) { using (OleDbConnection conn = new OleDbConnection(connstr)) { conn.Open(); string strSQL = "SELECT * FROM [Guests] WHERE ID = ?"; using (OleDbCommand cmd = new OleDbCommand(strSQL, conn)) { int id = CustomComboBox1.SelectedIndex; int idPlus = id + 1; cmd.Parameters.Add("?", idPlus); using (OleDbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Full_Name = reader["Vorname"].ToString() + ' ' + reader["Nachname"].ToString(); } } } string updateQuery = @"UPDATE [Rooms] SET Person = ? WHERE ID = ?"; using (OleDbCommand cmd = new OleDbCommand(updateQuery, conn)) { int id2 = customComboBox2.SelectedIndex; int idPlus2 = id2 + 2; // 先加SET对应的参数,再加WHERE对应的参数 cmd.Parameters.Add(new OleDbParameter("@Full_Name", Full_Name)); cmd.Parameters.Add("?", idPlus2); cmd.CommandType = CommandType.Text; int affectRows = cmd.ExecuteNonQuery(); // 可自行加判断逻辑:if(affectRows == 0) 提示无匹配的房间ID } } LoadTheme(); }
内容的提问来源于stack exchange,提问作者Benni Blatti
相关产品推荐
相关产品推荐

