哪个更好? 通过VBA / SQL命令文本或VBA /存储过程查询服务器?

我们需要使用来自Excel工作簿的OLEDB连接从SQL Server查询数据。 我们发现有两种方法可以做到这一点。 在安全性,维护性,性能,日常使用,最终用户使用等方面,你认为一个是整体优势吗?

  1. 通过VBA脚本将string参数通过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 
  2. 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 

由于其简单性,我个人更喜欢第二种方法。

这里的问题主要是防御SQL注入攻击。 在这两种解决scheme中,您都使用String参数。 用户可以input“= 1; Drop YourTable”;

我不太了解VBA,但是我知道在Java中有“Prepared Statement”命令来处理这个问题。 你应该对VBA SQL进行一些研究。

这是一个很好的文章。 http://bytes.com/topic/access/insights/864109-sql-injection-attack