2011-09-16 49 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對象。

希望這回答你的問題