簡體   English   中英

ADO命令參數未傳遞到存儲過程或存儲過程'忽略'參數

[英]ADO Command Parameter Not Passing to Stored Procedure or Stored Procedure 'Ignoring' Parameter

更新4

更新了整個問題以反映我的更改。 還是行不通。

這已經讓我煩惱了兩天了。 我正在更新客戶使用的舊訂購界面系統,用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命令正在傳遞參數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

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

最后

我以為我永遠不會解決這個問題,根本就沒有意義! 我會在它上面再進行一些測試,但看起來需要修剪變量。 我不知道為什么增加了額外的空間。

嘗試一下

objCmd.Parameters.Append objCmd.CreateParameter("@SearchQuery", adVarChar, adParamInput, 15, "'PalletCode'")

請注意,“'PalletCode'”內部還有一組額外的單引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM