[英]ADO Command Parameter Not Passing to Stored Procedure or Stored Procedure 'Ignoring' Parameter
這已經讓我煩惱了兩天了。 我正在更新客戶使用的舊訂購界面系統,用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'
所以到網頁本身......這是我用來獲取記錄集的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命令正在傳遞參數ok。 但那么為什么存儲過程不會像 @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
感謝邦德,特別是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 On
SET @SearchQuery = '%' + COALESCE(LTRIM(RTRIM(@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
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
我以為我永遠不會解決這個問題,根本就沒有意義! 我會在它上面再進行一些測試,但看起來需要修剪變量。 我不知道為什么增加了額外的空間。
嘗試一下
objCmd.Parameters.Append objCmd.CreateParameter("@SearchQuery", adVarChar, adParamInput, 15, "'PalletCode'")
請注意,“'PalletCode'”內部還有一組額外的單引號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.