【问题标题】:Which is better practice? Querying Server via VBA/SQL Command Text or VBA/Stored Procedure?哪个是更好的做法?通过 VBA/SQL 命令文本或 VBA/存储过程查询服务器?
【发布时间】:2015-06-30 22:17:50
【问题描述】:

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

  1. VBA 脚本到字符串参数以通过 Excel 中的连接定义 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 excel vba tsql


    【解决方案1】:

    我个人更喜欢第二种方法,因为它简单。

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

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

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

    【讨论】:

    • 感谢您的意见,Dasman,我会看看您现在分享的文章。
    猜你喜欢
    • 2011-12-30
    • 2017-09-23
    • 1970-01-01
    • 2018-11-10
    • 2012-07-20
    • 2020-02-11
    • 2016-10-19
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多