2012-07-26 69 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)默认情况下。