此查询在 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

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

    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()

直接错误是因为Transactionreserved word。在您的 INSERT 声明中将 table 名称括起来。

"INSERT INTO [Transaction] (

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

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

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