我继承了一个经典的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)
答案 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方法从参数中删除参数对象 必要时收集。
希望这能回答你的问题