2011-09-16 22 views
3

我已经继承了一个经典的asp网站,它使用存储过程的ADO Db Command对象。为什么在调用存储过程之前总是调用sp_sproc_columns?

我在sql分析器中注意到的一件事情是,对于每次调用存储过程,还有一个调用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

原来,这是非常简单的。您只需在之后设置命令对象上的连接,即可设置参数。像这样:

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

我倾向于说,你不能在一般情况下,为sp_sproc_columns文档指出它需要获取由ADODB需要的存储过程返回的列以返回具有适当数据类型的列。

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

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

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

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

您可以最小化到提供者的调用,以提高性能,如果你 知道与存储 过程或参数化查询要调用相关的参数属性。使用 CreateParameter方法创建具有 相应属性设置的Parameter对象,并使用Append方法将它们添加到Parameters集合的 。这使您可以设置并返回参数 值,而无需致电提供商参数 信息。如果您正在写入不提供 参数信息的提供程序,则必须使用此方法手动填充参数 集合才能够使用参数。如果需要,使用Delete方法从参数 集合中删除Parameter对象。

希望这回答你的问题