此查询在 Access 2010 中完美运行,但是当我尝试在代码中执行它时,在 INSERT INTO 语句中出现语法错误

Posted

技术标签:

【中文标题】此查询在 Access 2010 中完美运行,但是当我尝试在代码中执行它时,在 INSERT INTO 语句中出现语法错误【英文标题】:This query runs perfectly in Access 2010 but when I try to execute it in my code I get Syntax error in INSERT INTO statement 【发布时间】:2015-02-04 18:05:30 【问题描述】:

我是一个新手程序员,我看过其他类似的帖子,他们说问题通常是由于使用了保留字,但我确信我没有使用任何。 sql 在访问中运行良好并创建记录(使用变量 v_sqlquery 中的 sql,但是在 VB 中出现以下错误“INSERT INTO 语句中的语法错误”。谁能帮助我,我花了几个小时试图解决这个问题?提前谢谢。

    Dim v_SQLquery As String 'stores the sql query
    Dim v_command As OleDbCommand 'passes command to db
    Dim v_results As OleDbDataReader
    Dim v_custID As Integer
    Dim v_balance As String
    Dim v_purchase As String
    Dim v_date As Date
    Dim v_time As Date
    Dim v_transID As Integer


    v_custID = txt_custID.Text
    v_balance = txt_custbalance.Text
    v_purchase = txt_puramount.Text
    v_date = DateValue(Now) 'the current date
    v_time = TimeValue(Now) 'the current time

    If v_purchase = "" Then
        MsgBox("Please enter the purchase amount.")

    ElseIf v_purchase > v_balance Then
        MsgBox("There are not enough funds in the account to complete this transaction.")

        v_SQLquery = "INSERT INTO Transaction (Trans_type, Trans_amount, Trans_date, Trans_time, Cust_ID) VALUES ('P','" & v_purchase & "','" & v_date & "','" & v_time & "','" & v_custID & "');"


        v_command = New OleDbCommand(v_SQLquery, v_connection)


        v_results = v_command.ExecuteScalar 
    End If 

    v_connection.close()

【问题讨论】:

如果 v_purchase 或 v_custID 中有单引号 (') 会发生什么?什么输入触发了这个错误? 改为使用参数,看看错误是否消失。 您是否在调试模式下停止了代码,以便准确查看构建后的 v_SQLquery 的样子?你能发布它的样子吗?可能是查询没有正确构建。 啊! 停止连接你的SQL,并使用参数,它不仅为你避免了这个exact问题,而且它可以防止SQL注入和恶意用户。 【参考方案1】:

直接错误是因为Transaction 是reserved word。在 INSERT 语句中将该表名括起来。

"INSERT INTO [Transaction] (

解决该问题可能会暴露其他问题。例如,Access 的数据库引擎将包含在 # 字符中的日期识别为日期/时间数据类型,例如 #2015-02-04#。但是用单引号括起来的同一日期,'2015-02-04',将作为字符串值处理(它就是这样)。我们还不能确定该问题是否适用于您的情况。但是有一种方法可以避免此类分隔符问题。

正如其他人已经建议的那样,您最好使用参数化的INSERT,而不是将值连接到语句文本中。这种方法不仅可以保护您免受 SQL 注入,还可以避免您插入的值的分隔符问题。

请注意,无论哪种方法,您的表名的保留字问题仍然适用。

【讨论】:

感谢 HansUp。这已经解决了现在的问题。我会考虑其他的cmets。干杯

以上是关于此查询在 Access 2010 中完美运行,但是当我尝试在代码中执行它时,在 INSERT INTO 语句中出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MS Access 2010 中使用 VBA 选择多值组合框的值?

Access 2010 运行时错误 2185

在Access 2010中运行追加查询时出现“表已存在”错误

安装 office 2010 后 Access 2002/XP 查询出现问题

#姓名?在 Access 2010 中重新查询后的表单上

在 Access 2010 中重命名子窗体