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

时间:2015-06-30 22:17:51

标签: sql excel vba tsql

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

  1. 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
    
  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
    

1 个答案:

答案 0 :(得分:1)

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

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

我对VBA不太了解,但我知道在Java中有“Prepared Statement”命令可以解决这个问题。您应该对VBA SQL进行一些研究。

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