VB.NET操作Access数据库数据无法保存问题求助
问题:无法将TextBox数据更新到Access数据库(无报错但数据库未修改)
我在实现数据保存程序时遇到问题,无法将多个TextBox控件中的数据保存到MSACCESS数据库。代码执行无报错且显示执行成功,但数据库并未被修改。我推测是连接环节出现问题,但找不到具体原因,希望有人能指出我代码中的问题。
相关代码如下:
cn = New OleDbConnection cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & databaseName & "; Persist Security Info=False;" Dim cmd As OleDbCommand = New OleDbCommand() cmd.CommandType = CommandType.Text cmd.CommandText = "UPDATE [BRLocoDatabase2] SET [aDate] = @aDate, [aDepot] = @aDepot, [bDate] = @bDate, [bDepot] = @bDepot," & _ " [cDate] = @cDate, [cDepot] = @cDepot, [dDate] = @dDate, [dDepot] = @dDepot WHERE [LOCO] = @Loco" cmd.Parameters.AddWithValue("@Loco", TextBox1.Text) cmd.Parameters.AddWithValue("@aDate", TextBox19.Text) cmd.Parameters.AddWithValue("@aDepot", TextBox20.Text) cmd.Parameters.AddWithValue("@bDate", TextBox21.Text) cmd.Parameters.AddWithValue("@bDepot", TextBox22.Text) cmd.Parameters.AddWithValue("@cDate", TextBox23.Text) cmd.Parameters.AddWithValue("@cDepot", TextBox24.Text) cmd.Parameters.AddWithValue("@dDate", TextBox25.Text) cmd.Parameters.AddWithValue("@dDepot", TextBox26.Text) cmd.Connection = cn cn.Open() cmd.ExecuteNonQuery() MessageBox.Show("Update was a Success!") cn.Close()
排查方向及修复建议
检查WHERE子句匹配情况:
ExecuteNonQuery()的返回值代表受影响的行数,添加返回值捕获:Dim affectedRows As Integer = cmd.ExecuteNonQuery() MessageBox.Show($"受影响行数:{affectedRows}")如果返回0,说明
TextBox1.Text的值在数据库[LOCO]字段中没有匹配项,UPDATE语句未作用于任何行。修正参数顺序:OleDb不支持按参数名绑定,而是严格按照SQL语句中参数出现的顺序匹配。你的SQL里
@Loco是最后一个参数,但代码中第一个添加的就是它,这会导致参数绑定错位,WHERE条件失效。正确的添加顺序应该和SQL语句一致:' 按SQL中参数顺序添加:先aDate、aDepot...最后Loco cmd.Parameters.AddWithValue("@aDate", TextBox19.Text) cmd.Parameters.AddWithValue("@aDepot", TextBox20.Text) cmd.Parameters.AddWithValue("@bDate", TextBox21.Text) cmd.Parameters.AddWithValue("@bDepot", TextBox22.Text) cmd.Parameters.AddWithValue("@cDate", TextBox23.Text) cmd.Parameters.AddWithValue("@cDepot", TextBox24.Text) cmd.Parameters.AddWithValue("@dDate", TextBox25.Text) cmd.Parameters.AddWithValue("@dDepot", TextBox26.Text) cmd.Parameters.AddWithValue("@Loco", TextBox1.Text)验证数据库路径:确认
databaseName指向的是你实际查看的数据库文件。调试时,项目可能会将数据库文件复制到bin\Debug或bin\Release目录,你手动打开的可能是项目根目录的原文件,导致看不到修改。处理空值与类型转换:
AddWithValue可能会因TextBox为空或格式错误导致隐式类型转换问题,建议显式指定参数类型:' 处理日期字段,空值时传入DBNull.Value cmd.Parameters.Add("@aDate", OleDbType.Date).Value = If(String.IsNullOrWhiteSpace(TextBox19.Text), DBNull.Value, DateTime.Parse(TextBox19.Text))使用Using语句管理资源:避免连接泄漏,确保资源自动释放:
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & databaseName & "; Persist Security Info=False;") Using cmd As New OleDbCommand() cmd.Connection = cn cmd.CommandText = "UPDATE [BRLocoDatabase2] SET [aDate] = @aDate, [aDepot] = @aDepot, [bDate] = @bDate, [bDepot] = @bDepot, [cDate] = @cDate, [cDepot] = @cDepot, [dDate] = @dDate, [dDepot] = @dDepot WHERE [LOCO] = @Loco" ' 按正确顺序添加参数 cmd.Parameters.AddWithValue("@aDate", TextBox19.Text) cmd.Parameters.AddWithValue("@aDepot", TextBox20.Text) cmd.Parameters.AddWithValue("@bDate", TextBox21.Text) cmd.Parameters.AddWithValue("@bDepot", TextBox22.Text) cmd.Parameters.AddWithValue("@cDate", TextBox23.Text) cmd.Parameters.AddWithValue("@cDepot", TextBox24.Text) cmd.Parameters.AddWithValue("@dDate", TextBox25.Text) cmd.Parameters.AddWithValue("@dDepot", TextBox26.Text) cmd.Parameters.AddWithValue("@Loco", TextBox1.Text) cn.Open() Dim affectedRows = cmd.ExecuteNonQuery() MessageBox.Show($"更新完成,受影响行数:{affectedRows}") End Using End Using
内容的提问来源于stack exchange,提问作者DaveUU
相关产品推荐
相关产品推荐

