此查询在 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()
直接错误是因为Transaction
是reserved word。在您的 INSERT
声明中将 table 名称括起来。
"INSERT INTO [Transaction] (
解决该问题可能会暴露其他问题。例如,Access 的数据库引擎将 #
字符中包含的日期识别为 Date/Time 数据类型,例如 #2015-02-04#。但是用单引号括起来的相同日期 '2015-02-04' 将作为字符串值处理(它是)。我们尚不能确定该问题是否适用于您的情况。但是有一种方法可以避免此类分隔符问题。
正如其他人已经建议的那样,明智的做法是使用参数化 INSERT
而不是将值连接到语句文本中。这种方法不仅可以保护您免受 SQL 注入,还可以避免您插入的值的定界符问题。
请注意,无论使用哪种方法,您的 table 名称的保留字问题仍然适用。
我是一名新手程序员,我看过其他类似的帖子,他们说问题通常是由于使用了保留字,但我确定我没有使用任何保留字。 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()
直接错误是因为Transaction
是reserved word。在您的 INSERT
声明中将 table 名称括起来。
"INSERT INTO [Transaction] (
解决该问题可能会暴露其他问题。例如,Access 的数据库引擎将 #
字符中包含的日期识别为 Date/Time 数据类型,例如 #2015-02-04#。但是用单引号括起来的相同日期 '2015-02-04' 将作为字符串值处理(它是)。我们尚不能确定该问题是否适用于您的情况。但是有一种方法可以避免此类分隔符问题。
正如其他人已经建议的那样,明智的做法是使用参数化 INSERT
而不是将值连接到语句文本中。这种方法不仅可以保护您免受 SQL 注入,还可以避免您插入的值的定界符问题。
请注意,无论使用哪种方法,您的 table 名称的保留字问题仍然适用。