【问题标题】:Error after switching from ODBC DSN connection to OLEDB从 ODBC DSN 连接切换到 OLEDB 后出错
【发布时间】:2012-07-26 17:08:34
【问题描述】:

从我的 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,并且您不应该将 create 语句括在括号中,AFAIK。一旦进行了这些更改,它就适用于 ODBC 和 OLEDB。
  • 您是否尝试将参数命名为"@param1" 而不是"param1"
  • @Remou:你的意思是对Append的调用不需要括号对吗?
  • 是的。我愿意。据我所知,不仅不需要,而且不应该。我用 VBScript 进行了测试,我很确定同样的规则适用。
  • @Remou:是的,他们有,我同意他们不应该不在那里。

标签: sql-server asp-classic odbc oledb


【解决方案1】:

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

CommandType Property

如果 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 指定为等于4adCmdStoredProc,然后您的代码才能运行。
顺便说一句,默认情况下它是 -1 (adCmdUnknown)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多