为什么调用存储过程总是先调用sp_sproc_columns?

时间:2011-09-16 09:01:27

标签: asp-classic ado

我继承了一个经典的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)

2 个答案:

答案 0 :(得分:2)

事实证明这很简单。您只需在设置参数后在命令对象上设置连接。像这样:

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.

答案 1 :(得分:1)

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

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

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

  

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

     

如果您尚未定义自己的Parameter对象,则可以访问   调用Refresh方法之前的参数集合,ADO会   自动调用方法并为您填充集合。

     

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

希望这能回答你的问题