2

从我的 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 调用不适用于不同的连接字符串?

4

1 回答 1

1

有一些拼写错误,.CreateParameters => .CreateParameter.CursorLocatoin => .CursorLocation
忽略了它们,因为看起来拼写错误只适用于问题。

CommandType 属性

如果 CommandType 属性值设置为默认值 adCmdUnknown,您可能会遇到性能下降的情况,因为 ADO 必须调用提供程序以确定 CommandText 属性是 SQL 语句、存储过程还是表名。如果您知道所使用的命令类型,则设置 CommandType 属性会指示 ADO 直接转到相关代码。如果 CommandType 属性与 CommandText 属性中的命令类型不匹配,则在调用 Execute 方法时会出错。

CommandType据我了解,未指定时,操作因提供商而异。

我使用 SQL Server Profiler 跟踪查询。我看到的是 OLEDB Provider,没有 CommandType 属性的命令对象在后台执行没有参数的查询,例如:Exec storedproc,这意味着如果过程是无参数的,它可以正常工作。然而它应该是Exec storedproc parametervalue。另一方面,正如您所说,相同的代码在 MySQL 上就像一个魅力。

因此,需要指定cmd.CommandType等于adCmdStoredProc4 然后您的代码才能工作。
顺便说一句,默认为-1 ( adCmdUnknown)。

于 2012-07-28T00:06:15.293 回答