2012-07-26 40 views
2

我一直有我的ASP應用程序超時和登錄連接問題到我的SQL Server數據庫。我的主機提供商建議將我的連接字符串從ODBC DSN更改爲OLEDB。一旦我這樣做,我執行我的第一個存儲過程時出現此錯誤。從ODBC DSN連接切換到OLEDB後出錯

過程或函數'storedproc'需要參數'@ param1',其中 未提供。

這裏是我的連接字符串

Dim objconn 
Set objconn = Server.CreateObject("ADODB.Connection") 
objconn.open "Provider=SQLOLEDB;Data Source=localhost\sqlexpress;Initial Catalog=db;user id=user;password=pw" 

這裏是我的存儲過程調用

Dim objrs, cmd 
Set cmd = Server.CreateObject("ADODB.Command") 
Set cmd.ActiveConnection = objconn 
cmd.CommandText = "storedproc" 
cmd.Parameters.Append(cmd.CreateParameters("param1",adDouble,adParamInput,,session("param1"))) 
Set objrs = Server.CreateObject("ADODB.Recordset") 
objrs.CursorLocatoin = adUseClient 
objrs.Open cmd 

任何想法,爲什麼我的電話PROC不具有不同的連接字符串工作嗎?

+0

你說CreateParameters,但它應該是CreateParameter,你不應該把方括號中的create語句括起來,AFAIK。一旦進行這些更改,它對ODBC和OLEDB都適用。 – Fionnuala 2012-07-26 19:18:54

+0

你是否嘗試實際命名參數'「@param1」'而不是'「param1」'? – AnthonyWJones 2012-07-27 08:39:16

+0

@Remou:你的意思是'Append'的調用不需要沒有偏見嗎? – AnthonyWJones 2012-07-27 08:40:06

回答

1

有幾個錯別字,.CreateParameters => .CreateParameter.CursorLocatoin => .CursorLocation
我忽略了他們,因爲長得像錯別字只適用於這個問題。

CommandType Property

如果CommandType屬性值設置爲默認值, adCmdUnknown,您可能會遇到性能降低,因爲ADO 必須打電話給供應商,以確定是否在CommandText 屬性是一個SQL語句,存儲過程或表名。如果 你知道你正在使用什麼類型的命令,設置CommandType 屬性指示ADO直接去相關的代碼。如果 CommandType屬性與 CommandText屬性中的命令類型不匹配,則在調用執行 方法時會發生錯誤。

據我所知,當未指定CommandType時,採取的行動取決於供應商。

我使用SQL Server Profiler跟蹤查詢。我看到的是OLEDB Provider,沒有CommandType屬性的命令對象在後臺執行一個沒有參數的查詢,如下所示:Exec storedproc,這意味着如果該過程是無參數的,它將正常工作。但它應該是Exec storedproc parametervalue。另一方面,如你所說,相同的代碼就像MySQL的魅力一樣。

所以,需要指定cmd.CommandTypeadCmdStoredProc即等於,那麼你的代碼將工作。
順便說一句,它是-1adCmdUnknown)默認情況下。