如何修改Access数据库中的指定单条实体记录?
错误原因
- 拼接SQL语句时
WHERE关键字前缺少空格,最终生成的SQL会出现difficulty = 3WHERE这类语法错误,无法被数据库识别 Front为文本类型字段,传入的文本值两端需要添加单引号包裹,否则会被Access判定为字段名而非查询值,触发报错- 即使上述问题修复,若存在多张正面内容完全一致的闪卡,依然会出现批量修改的问题,不符合需求
解决方案
步骤1:给表添加唯一主键
打开Access的flashcards表设计视图,新增一个名为id的字段,字段类型设置为自动编号,并将其设为表主键。该字段会自动为每一条新增的闪卡分配全局唯一的数值标识,不会出现重复。
步骤2:存储当前浏览闪卡的主键值
你在窗体加载展示单张闪卡内容时,同步将对应闪卡的id值存储下来,可选择存在窗体级变量,或是一个不可见的文本框控件(比如命名为txtHiddenId)中。
步骤3:修改提交代码
更推荐使用参数化查询的写法,既可以避免SQL注入风险,也不需要手动处理引号、空格等拼接问题,示例代码如下:
Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click ' 参数化查询写法,更安全稳定 Dim sql As String = "UPDATE flashcards SET difficulty = @difficulty WHERE id = @id" Using conn As New OleDbConnection("你的Access数据库连接字符串") conn.Open() Using cmd As New OleDbCommand(sql, conn) ' 按顺序添加参数(OleDb不按参数名匹配,按添加顺序匹配) cmd.Parameters.AddWithValue("@difficulty", CInt(TxtDifficulty.Text)) cmd.Parameters.AddWithValue("@id", CInt(txtHiddenId.Text)) cmd.ExecuteNonQuery() End Using End Using End Sub
如果你暂时不想修改原有runSQL的调用逻辑,也可以使用修正后的拼接写法(仅临时使用,不推荐生产环境用):
Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click Dim sql As String ' 注意WHERE前加空格,用主键id匹配唯一记录 sql = "UPDATE flashcards set difficulty = " & TxtDifficulty.Text & " WHERE id = " & txtHiddenId.Text runSQL(sql) End Sub
内容的提问来源于stack exchange,提问作者Idk
相关产品推荐
相关产品推荐

