Sql server 从ODBC DSN连接切换到OLEDB后出错

Sql server 从ODBC DSN连接切换到OLEDB后出错,sql-server,asp-classic,odbc,oledb,Sql Server,Asp Classic,Odbc,Oledb,我的ASP应用程序与SQL Server数据库之间存在超时和登录连接问题。我的主机提供商建议将我的连接字符串从ODBC DSN更改为OLEDB。一旦我这样做了,我在执行第一个存储过程时就会出现这个错误 过程或函数“storedproc”需要参数“@param1”,该参数 没有供应 这是我的连接字符串 Dim objconn Set objconn = Server.CreateObject("ADODB.Connection") objconn.open "Provider=SQLOLEDB;D

我的ASP应用程序与SQL Server数据库之间存在超时和登录连接问题。我的主机提供商建议将我的连接字符串从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调用不能与其他连接字符串一起工作吗?

有一些输入错误,
.CreateParameters=>.CreateParameter
CursorLocation=>.CursorLocation

我忽略了它们,因为看起来打字错误只适用于这个问题。

如果CommandType属性值设置为默认值, adCmdUnknown,由于ADO 必须调用提供程序以确定CommandText 属性是SQL语句、存储过程或表名。如果 通过设置CommandType,您知道您正在使用的命令类型 属性指示ADO直接转到相关代码。如果 CommandType属性与中的命令类型不匹配 CommandText属性,调用执行时出错 方法

据我所知,当未指定
CommandType
时,操作会因提供程序而异。

我使用SQLServer探查器跟踪查询。我看到的是,在OLEDB Provider中,command objects without CommandType属性在后台执行一个不带参数的查询,类似这样:
Exec storedproc
,这意味着如果该过程是无参数的,它可以正常工作。但是,它应该是Exec storedproc parametervalue
。另一方面,正如您所说的,相同的代码在MySQL上工作得很有魅力。

因此,需要将
cmd.CommandType
指定为等于4
adCmdStoredProc
,这样代码就可以工作了。

顺便说一句,默认情况下它是-1
adCmdUnknown

您说的是CreateParameters,但应该是CreateParameter,并且不应该将create语句括在括号中,AFAIK。一旦做了这些更改,ODBC和OLEDB对我都有效。您是否尝试将参数命名为
“@param1”
,而不是
“param1”
?@Remou:您的意思是调用
Append
不需要使用paranthes,对吗?是的。我愿意。据我所知,不仅需要,而且不应该。我用VBScript进行了测试,我很确定同样的规则也适用。@Remou:是的,它们适用,我同意它们不应该存在。