VB.NET中OleDbCommand使用Where子句执行SQL报错求助
问题原因
- 核心SQL语法错误:INSERT语句不支持WHERE子句,INSERT的作用是插入全新的行数据,不需要指定匹配条件。你当前的SQL为
insert into [stats]([op_10]) Values (1) WHERE ( [numero_of ]='xxx' ),完全不符合INSERT语法规则,数据库解析到VALUES结束后遇到非法的WHERE关键字,无法继续解析,因此抛出指令末尾缺少分号的报错。 - 执行逻辑错误:增删改类非查询SQL不应该调用
ExecuteReader方法,该方法仅用于执行查询类SQL返回结果集,调用方法不匹配也会引发执行异常。 - 隐存风险:直接拼接字符串构造SQL存在SQL注入风险,也容易因为特殊字符引发语法错误。
- 资源泄露风险:代码中没有主动关闭数据库连接,会引发连接资源泄露。
解决方法
首先确认业务需求,调整SQL后优化执行逻辑即可:
- 如果你的需求是新增一条stats表记录,直接删除WHERE子句,同时把匹配的numero_of字段加入插入字段:
insert into [stats]([op_10], [numero_of]) Values (1, @num_off) - 如果你的需求是更新已存在的、numero_of字段匹配的行的op_10值,将INSERT语句替换为UPDATE语句:
update [stats] set [op_10] = 1 where [numero_of] = @num_off
调整后的完整代码参考(以更新场景为例,新增场景替换对应SQL即可):
Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click ' 使用Using块自动释放连接资源,无需手动关闭 Using con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\stagiaire\Desktop\App_Web.MDB") Try con.Open() Catch ex As Exception Response.Write("<script language=""javascript"">alert('Pas de Connexion');</script>") Return ' 连接失败直接退出,不执行后续操作 End Try Dim num_off As String = CType(WebForm1.num_of, String) ' 使用参数化查询,避免SQL注入和拼接语法错误 Dim cmd As OleDbCommand = New OleDbCommand("update [stats] set [op_10] = ? where [numero_of] = ?", con) ' OleDb按参数顺序匹配,依次传入参数值 cmd.Parameters.AddWithValue("@op10", 1) cmd.Parameters.AddWithValue("@num_off", num_off) ' 非查询操作直接调用ExecuteNonQuery,返回受影响行数 Dim affectRows As Integer = cmd.ExecuteNonQuery() If affectRows > 0 Then ' 可自定义执行成功的逻辑 End If cmd.Dispose() End Using Me.Visible = False Response.Redirect("WebForm3.aspx") End Sub
内容的提问来源于stack exchange,提问作者Azii0803
相关产品推荐
相关产品推荐

