ADO 命令参数未传递给存储过程或存储过程 忽略"参数

本教程将介绍ADO 命令参数未传递给存储过程或存储过程“忽略"参数的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

ADO 命令参数未传递给存储过程或存储过程 忽略"参数 教程 第1张

问题描述

这已经困扰我两天了.我正在更新我们的客户使用的旧订购界面系统,它是用 ASP Classic、VBScript 编写的.它连接到 Windows Server 2003 上的 SQL 数据库.

我有一个存储过程,它返回一个托盘代码列表,按客户 ID 过滤并可以按托盘代码搜索:

CREATE PROCEDURE dbo.sp_PalletSearch
@CustomerRef  Int,
@SearchQuery  VarChar(15) = '%'
AS

SET NoCount OnSET @SearchQuery = '%' + COALESCE(@SearchQuery, '%') + '%'

SELECTp.PalletID,
p.PalletCode
FROM  dbo.v_PalletSearch p
WHERE p.CustomerRef= @CustomerRef
ANDp.PalletCode LIKE @SearchQuery
ORDER BY p.PalletCode ASC

SET NoCount Off
GO

无论有什么搜索词,这在 SQL 查询分析器中似乎都可以正常工作:

exec sp_PalletSearch 100, ''exec sp_PalletSearch 100, 'PalletCode'

所以到网页本身...这是我用来获取记录集的 ADO 命令,这就是我的问题开始的地方.它只是不会返回任何东西:

Dim strSearchQuery
strSearchQuery = "PalletCode"

Dim objCmd
Set objCmd = Server.CreateObject("ADODB.Command")
objCmd.ActiveConnection = cConn
objCmd.CommandType = adCmdStoredProc
objCmd.CommandText = "sp_PalletSearch"
objCmd.Parameters.Append objCmd.CreateParameter("@CustomerRef", adInteger, adParamInput)
objCmd.Parameters.Append objCmd.CreateParameter("@SearchQuery", adVarChar, adParamInput, 15)
objCmd.Parameters("@CustomerRef").Value = CustomerID
objCmd.Parameters("@SearchQuery").Value = strSearchQuery

Dim objRS
Set objRS = objCmd.Execute
Set objCmd = Nothing


Do While Not objRS.EOF
 Response.Write(objRS("PalletID").Name & ": " & objRS("PalletID").Value & " | " & objRS("PalletCode").Name & ": " & objRS("PalletCode").Value & "<br>")
 objRS.MoveNext
Loop
objRS.Close
Set objRS = Nothing

我试过了...

如果我在我的 ADO 命令中编辑这一行:

objCmd.CommandText = "sp_PalletSearch"

并将其更改为:

objCmd.CommandText = "{call sp_PalletSearch(?, '" & strSearchQuery & "')}"

然后删除:

objCmd.CommandType = adCmdStoredProc

所有搜索工作正常.如果找不到解决方案,我会坚持这样做.

如果我编辑存储过程以获取 搜索词而不是 的托盘代码,并注释掉

--SET @SearchQuery = '%' + COALESCE(@SearchQuery, '%') + '%'

然后我会得到完全匹配的.这将告诉我 ADO 命令正在传递参数正常.但是那么为什么存储过程不会得到结果 @SearchQuery?

要注意的另一件事是,将 ADO 命令替换为以下代码对于托盘代码 效果很好.我不认为这个片段是一个安全的选项,如果我错了,请告诉我.我宁愿使用参数化命令:

strSQL = "EXECUTE sp_PalletSearch " & CustomerID & ", '" & strSearchQuery & "' "
Set objRS = Server.CreateObject("ADODB.Recordset")
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open cConn
objRS.Open strSQL, objConn

这是一个很大的要求,但我喜欢高效且正确地做事,而且我喜欢学习.我希望你们能帮助我解决这个难题.

推荐答案

已解决

感谢 Bond,尤其是 Lankymart 的帮助.Lankymart,您使用 SQL Profiler 的建议有所帮助.我猜我的服务器有旧版本 - Profiler.

我在查看 Profiler Trace 时发现了这一点:@SearchQuery = 'bww100052'

所以我决定在存储过程中强制进行修剪:LTRIM(RTRIM(@SearchQuery))

CREATE PROCEDURE dbo.sp_PalletSearch
@CustomerRef  Int,
@SearchQuery  VarChar(15) = '%'
AS 

SET NoCount OnSET @SearchQuery = '%' + COALESCE(LTRIM(RTRIM(@SearchQuery)), '%') + '%'

SELECTp.PalletID,
p.PalletCode
FROM  dbo.v_PalletSearch p
WHERE p.CustomerRef= @CustomerRef
ANDp.PalletCode LIKE @SearchQuery
ORDER BY p.PalletCode ASC

SET NoCount Off
GO

ADO 命令

Dim objCmd
Set objCmd = Server.CreateObject("ADODB.Command")
objCmd.ActiveConnection = cConn
objCmd.CommandType = adCmdStoredProc
objCmd.CommandText = "sp_PalletSearch"
objCmd.Parameters.Append objCmd.CreateParameter("@CustomerRef", adInteger, adParamInput)
objCmd.Parameters.Append objCmd.CreateParameter("@SearchQuery", adVarChar, adParamInput, 15)
objCmd.Parameters("@CustomerRef").Value = CustomerID
objCmd.Parameters("@SearchQuery").Value = Trim(strSearchQuery)

Dim objRS
Set objRS = objCmd.Execute
Set objCmd = Nothing

终于

我以为我永远无法解决这个问题,这根本没有意义!我将对其进行更多测试,但看起来需要修剪变量.我不知道为什么要添加额外的空间.

好了关于ADO 命令参数未传递给存储过程或存储过程“忽略"参数的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。