我们需要使用Excel工作簿中的OLEDB连接从SQL Server查询数据。我们发现有两种方法可以做到这一点。在安全性,维护,性能,日常使用,最终用户使用等方面,您认为一个人比另一个人具有整体优势吗?
VBA脚本,用于通过Excel中的Connections定义SQL命令文本的字符串参数:
Sub ParamPass()
Dim qPreText As String
Dim qPostText As String
Dim valueToFilter As String
Dim paramPosition As Integer
valueToFilter = "TableName.ColumnName ="
With
ActiveWorkbook.Connections("ConnectionName").OLEDBConnection
qPreText = .CommandText
paramPosition = InStr(qPreText, valueToFilter) + Len(valueToFilter)-1
qPreText = Left(qPreText, paramPosition)
qPostText = .CommandText
qPostText = Right(qPostText, Len(qPostText) - paramPosition)
qPostText = Right(qPostText, Len(qPostText) - InStr(qPostText, ")") + 1)
.CommandText = qPreText & " '" & Sheets("SheetName").Range("CellReference").Value & "'" & qPostText
End With
ActiveWorkbook.Connections("ConnectionName").Refresh
End Sub
调用VBA脚本并将参数传递给数据库中的存储过程:
Sub ParamPass()
Dim MyValueToPass As String
MyValueToPass = Sheets("SheetName").Range("CellReference").Value
With
ActiveWorkbook.Connections("ConnectionName").OLEDBConnection
.CommandText = "exec dbo.StoredProcName '" & MyValueToPass & "'"
ActiveWorkbook.Connections("ConnectionName").Refresh
End With
End Sub
答案 0 :(得分:1)
由于其简单性,我个人更喜欢第二种方法。
这里的问题主要是防御SQL注入攻击。在两种解决方案中,您都使用String参数。用户可以输入“= 1; Drop YourTable;”
我对VBA不太了解,但我知道在Java中有“Prepared Statement”命令可以解决这个问题。您应该对VBA SQL进行一些研究。
这是一篇很好的文章。 http://bytes.com/topic/access/insights/864109-sql-injection-attack