【问题标题】:Why is calling a stored procedure always preceded by a call to sp_sproc_columns?为什么调用存储过程之前总是调用 sp_sproc_columns?
【发布时间】:2011-09-16 09:01:27
【问题描述】:

我继承了一个经典的 asp 站点,它使用 ADO Db Command 对象进行存储过程。

我注意到,在 sql profiler 中,每次调用存储过程都会调用 sp_sproc_columns。如何阻止此呼叫?

用于调用存储过程的代码是这样的形式:

Dim objCmd
Set objCmd = server.CreateObject("adodb.command")
objCmd.ActiveConnection = oConn 'scoped globally
objCmd.CommandType = adCmdStoredProc
objCmd.CommandText = "dbname.dbo.sprocName"

objCmd.Parameters.Append objCmd.CreateParameter ("@Paramater1", adInteger, adParamInput, , 123)
objCmd.Parameters.Append objCmd.CreateParameter ("@Paramater2", adInteger, adParamInput, , 456)

【问题讨论】:

    标签: asp-classic ado


    【解决方案1】:

    事实证明这真的很简单。您所要做的就是在设置参数之后在命令对象上设置连接。像这样:

    Dim objCmd
    Set objCmd = server.CreateObject("adodb.command")
    objCmd.CommandType = adCmdStoredProc
    objCmd.CommandText = "dbname.dbo.sprocName"
    objCmd.Parameters.Append objCmd.CreateParameter ("@Paramater1", adInteger, adParamInput, , 123)
    objCmd.Parameters.Append objCmd.CreateParameter ("@Paramater2", adInteger, adParamInput, , 456)
    objCmd.ActiveConnection = oConn 'set after the command object has been fully configured.
    

    【讨论】:

      【解决方案2】:

      我倾向于说您不能在一般情况下sp_sproc_columns 的文档声明需要获取将由存储过程返回的列我假设 ADODB 需要它来返回具有适当数据类型的列。

      在已知存储过程的特定情况下,有一个有趣的mailing list 讨论表明,如果您完全具体了解参数,则可以避免调用。

      ADODB.Command 的文档似乎支持这个建议,我强调了几个相关部分:

      对 Command 对象的 Parameters 集合使用 Refresh 方法 检索存储过程的提供程序参数信息或 Command 对象中指定的参数化查询。一些供应商会 不支持存储过程调用或参数化查询;打电话 使用此类时,Parameters 集合上的 Refresh 方法 提供者将返回错误。

      如果您尚未定义自己的 Parameter 对象并且您访问 在调用 Refresh 方法之前收集参数,ADO 将 自动调用该方法并为您填充集合。

      您可以尽量减少对提供程序的调用以提高性能,如果您 知道与存储的参数相关的属性 您希望调用的过程 或参数化查询。使用 CreateParameter 方法用于创建 Parameter 对象 适当的属性设置并使用 Append 方法将它们添加到 参数集合。这使您可以设置和返回参数 值无需调用参数的提供者 信息。如果您正在写信给不提供 参数信息,必须手动填充Parameters 使用这种方法的集合完全可以使用参数。采用 从参数中删除参数对象的 Delete 方法 必要时收集。

      希望这能回答你的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-07
        • 2013-08-06
        • 2012-09-02
        • 2010-10-15
        • 1970-01-01
        相关资源
        最近更新 更多