Excel – SQL'INSERT INTO'查询语法错误

我正在尝试使用Excel中的数据对MS Access数据库进行简单的插入查询。 我正在使用硬编码值进行testing的参数化查询。 直接在Access中运行查询,但试图通过VBA执行它会导致语法错误。 该查询当前插入Access表中的自动生成的ID以外的每个字段。

Sub Test_SQL() Dim conn As ADODB.Connection Dim cmd As ADODB.Command Dim result Dim id As Integer Dim year As Integer Dim month As String Dim combocode As String Dim credamt As Double Dim qty As Integer Dim itemcode As String Dim sepbundleamt As Double Dim prodname As String '*********query variables******************** year = 2017 month = "July" combocode = "COMBCOD1" credamt = 420 qty = 21 itemcode = "ITEMCOD1" sepbundleamt = 12 prodname = "Test Product" '********open DB connection and execute insertion****** On Error GoTo ErrorHandler Set conn = New ADODB.Connection Set cmd = New ADODB.Command With conn .Provider = "Microsoft.ACE.OLEDB.12.0;" .ConnectionString = [redacted] .Open End With With cmd .ActiveConnection = conn .CommandType = adCmdText .CommandText = "INSERT INTO SB_DSLR (Year, Month, ComboCode, CreditAmt, Qty, ItemCode, SepBundleAmt, ProductName) VALUES (?,?,?,?,?,?,?,?);" End With With cmd.Parameters .Append cmd.CreateParameter("Year", adInteger, adParamInput, 4, year) .Append cmd.CreateParameter("Month", adWChar, adParamInput, 10, month) .Append cmd.CreateParameter("ComboCode", adWChar, adParamInput, 10, combocode) .Append cmd.CreateParameter("CreditAmt", adDouble, adParamInput, 10, credamt) .Append cmd.CreateParameter("Qty", adInteger, adParamInput, 10, qty) .Append cmd.CreateParameter("ItemCode", adWChar, adParamInput, 8, itemcode) .Append cmd.CreateParameter("SepBundleAmt", adDouble, adParamInput, 10, sepbundleamt) .Append cmd.CreateParameter("ProductName", adWChar, adParamInput, 100, prodname) End With cmd.Execute conn.Close Set cmd = Nothing Exit Sub ErrorHandler: MsgBox (Err.Number & ": " & Err.Description) If conn.State = adStateOpen Then conn.Close End If Set cmd = Nothing End Sub 

这种一般性错误有多种原因,但MSAccess.exe中的相同查询工作的事实表明保留字是原因。

的确, MonthYear是Jet保留字 , Year是MS Access保留字 。 两者都被命名为其他方法的函数和参数。 有时候,.exe可能是宽松的,而ODBC连接则更加严格。 因此,可以考虑用反引号或方括号来转义这些词,或者完全避免这样的词。

 .CommandText = "INSERT INTO SB_DSLR (`Year`, `Month`, ComboCode, CreditAmt, Qty, ItemCode, SepBundleAmt, ProductName) VALUES (?,?,?,?,?,?,?,?);" .CommandText = "INSERT INTO SB_DSLR ([Year], [Month], ComboCode, CreditAmt, Qty, ItemCode, SepBundleAmt, ProductName) VALUES (?,?,?,?,?,?,?,?);"