ADO 命令参数未传递给存储过程或存储过程 忽略"参数
本教程将介绍ADO 命令参数未传递给存储过程或存储过程“忽略"参数的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
这已经困扰我两天了.我正在更新我们的客户使用的旧订购界面系统,它是用 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 命令参数未传递给存储过程或存储过程“忽略"参数的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。