因此,我对SQL编码有点陌生,我的公司拥有一个预先存在的采购订单系统,在启用了.xlsx宏的工作表上运行。
我不断收到“靠近”的不正确语法,并且当我在此处或那里更改随机逗号时,会出现不同错误。当抛出错误并进行热调试时,它会突出显示{ {1}}行
那么,任何东西在每个人训练有素的眼睛中都突出吗? 谢谢!
SetRS = Conn.Execute(SQL)
答案 0 :(得分:2)
随着您的体验,在一条指令中执行尽可能多的操作会使代码更难以阅读和调试。
那就是说我有95%的把握确定Range("H30").Value & Excel.WorksheetFunction.Sum(Report.Range("F16:F29"))
不是您打算要做的事情。
分解:
Dim value1 As Double
value1 = ActiveSheet.Range("H12").Value
Dim value2 As String
value2 = "'" & ActiveSheet.Range("H30").Value & "'"
Dim value3 As Double
value3 = Excel.WorksheetFunction.Sum(Report.Range("F16:F29"))
Dim value4 As Double
value4 = ActiveSheet.Range("A34").Value
Dim value5 As String
value5 = "'" & ActiveSheet.Range("F7").Value & "'"
Dim value6 As String
value6 = "'" & ActiveSheet.Range("C12").Value & "'"
Dim value7 As String
value7 = "'" & ActiveSheet.Range("A38").Value & "'"
Dim value8 As Long
value8 = 0
Dim value9 As String
value9 = "'" & Code & "'"
现在,您可以单独验证每个值。都好?现在将它们串联:
Dim values As Variant
values = Join(Array(value1, value2, value3, value4, value5, value6, value7, value8, value9), ",")
Dim sql As String
sql = "insert into Purchases.dbo.POs values(" & values & ")"
SQL字符串看起来正确吗?
Debug.Print sql
Stop 'hit Ctrl+G to bring up the *immediate pane* and view the output
如果获取该输出并在SSMS中运行,插入是否起作用?是啊那你很好去!
conn.Execute sql
现在,假设ActiveSheet.Range("H30").Value
包含恶意字符串;直接通过连接执行该语句将使insert
语句失败,并且SQL Server将愉快地执行粗心串联到查询中的可执行SQL语句:this comes to mind,查找“ SQL注入”有关更多信息。
研究如何对每个值使用ADODB.Command
和ADODB.Parameter
,并立即避免此安全漏洞。当值包含一个'
单引号时,它还可以防止代码产生无效的SQL语句-并且,作为奖励,您不再需要关心用单引号引起来的字符串,服务器将对其进行处理。
答案 1 :(得分:1)
StringBuilders具有AppendFormat函数,可轻松创建SQL语句。
StringBuilder.AppendFormat Method
将通过处理包含零个或多个格式项的复合格式字符串返回的字符串追加到此实例。每个格式项都由对应的对象参数的字符串表示形式替换。
注意:VBA使用StringBuilder.AppendFormat_4处理格式字符串和值数组。
StringBuilder.AppendFormat_4 Format, Array()
Const Code = 10
Dim sb As Object
Dim SQL As String
Dim Report As Worksheet
Set Report = Excel.ActiveSheet
Set sb = CreateObject("System.Text.StringBuilder")
SQL = "INSERT INTO Purchases.DBO.Pos VALUES({0},'{1}',{2},'{3}','{4}','{5}','{6}',0,'{7}')"
sb.AppendFormat_4 SQL, Array(Range("H12").Value, _
Range("H30").Value, _
Excel.WorksheetFunction.Sum(Range("F16:F29")), _
Range("A34").Value, _
Range("F7").Value, _
Range("C12").Value, _
Range("A38").Value, _
Code)
SQL = sb.ToString
IMO。大写的SQL关键字使SQL语句更易于阅读。我还将提供添加字段列表的语句。
INSERT INTO Purchases.DBO.Pos(FirstName,LastName) VALUES('Tin','Man')