gpt4 book ai didi

sql - ADO 命令参数未传递到存储过程或存储过程 'Ignoring' 参数

转载 作者:行者123 更新时间:2023-12-01 05:10:25 24 4
gpt4 key购买 nike

更新 4
更新了整个问题以反射(reflect)我的更改。还是行不通。
这已经困扰了我两天了。我正在更新我们的客户使用的旧订购界面系统,该系统是用 ASP Classic 和 VBScript 编写的。它连接到 Windows Server 2003 上的 SQL 数据库。
存储过程
我有一个存储过程,它返回一个托盘代码列表,按客户 ID 过滤并可按托盘代码搜索:

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

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

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

SET NoCount Off
GO
这在带有和不带有搜索词的 SQL 查询分析器中似乎都可以正常工作: exec sp_PalletSearch 100, ''exec sp_PalletSearch 100, 'PalletCode'ASP网页
所以到网页本身...这是我用来获取记录集的 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
所有搜索工作正常。
如果找不到真正的解决方案,这就是我将坚持的。

如果我编辑存储过程以获取等于搜索词而不是 LIKE 的托盘代码,并注释掉
--SET @SearchQuery = '%' + COALESCE(@SearchQuery, '%') + '%'
然后我会得到完全匹配。这会告诉我 ADO 命令正在传递参数。 但是那么为什么存储过程不会得到类似 @SearchQuery 的结果? ?

另一件要注意的事情是,用以下代码替换 ADO 命令可以很好地处理托盘代码 LIKE。我不认为这个片段是一个安全的选择,如果我错了,请告诉我。我宁愿使用参数化命令:
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

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

最佳答案

我认为你尝试任何事情都会给自己带来更多问题。每次尝试都会在语法上犯一些小错误(例如引号在错误的地方,没有指定 CommandType 等)。

如果它有帮助,这就是我为该存储过程编码的方式

Dim cmd, rs, sql
Dim data, rows, row

Set cmd = Server.CreateObject("ADODB.Command")
'Name of your stored procedure
sql = "dbo.sp_PalletSearch"

With cmd
.ActiveConnection = cConn 'Assuming cConn is a connection string variable
.CommandType = adCmdStoredProc
.CommandText = sql
'Define Stored Procedure parameters
Call .Parameters.Append(.CreateParameter("@CustomerRef", adInteger, adParamInput, 4))
Call .Parameters.Append(.CreateParameter("@SearchQuery", adVarChar, adParamInput, 15))
'First parameter is optional so only pass if we have a value, will default to NULL.
If Len(CustomerId) > 0 Then .Parameters("@CustomerRef").Value = CustomerID
.Parameters("@SearchQuery").Value = strSearchQuery
Set rs = .Execute()

'Populate 2D-Array with data from Recordset
If Not rs.EOF Then data = rs.GetRows()

'Close and Release Recordset from memory
Call rs.Close()
Set rs = Nothing
End With
Set cmd = Nothing

If IsArray(data) Then
rows = UBound(data, 2)
For row = 0 To rows
Call Response.Write("Pallet Id: " & data(0, row) & " | Pallet Code: " & data(1, row) & "</ br>")
Next
End If

关于sql - ADO 命令参数未传递到存储过程或存储过程 'Ignoring' 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25508050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com