2014-09-30 33 views
0

我有一個aspx頁面,允許用戶輸入字符串asp:ControlParameter,然後使用SelectCommand傳遞給存儲過程。無法使用asp將通配符傳遞給存儲過程:ControlParameter

問題是,如果用戶在文本框中輸入123456%以獲取所有匹配項,則調用console.aspx頁會引發datareader錯誤。如果他們輸入123456它工作正常。

存儲過程使用包括代碼:

l.nbr = @Nbr + '%' 

這將返回所有的可能性,但是用戶希望它只是除非他們在文本框中輸入通配符%返回精確匹配。

我已經在SSMS中編寫了一個查詢來重複我想要的,它工作正常。

什麼導致數據讀取器無法將通配符的參數傳遞給存儲過程?

ASPX代碼:

<asp:SqlDataSource ID="dsBook" runat="server" 
    SelectCommand="spLoadList" SelectCommandType="StoredProcedure" 
    CancelSelectOnNullParameter="False"> 
<SelectParameter> 
    <asp:ControlParameter ControlID="txtNbr" 
          Name="Number"    
          Type="String" DefalultValue="" 
          PropertyName="Text" /> 
</SelectParameters> 
</asp:SqlDataSource> 

存儲過程:

SELECT 
     b.Id 
    FROM dbo.Book b 
    LEFT OUTER JOIN dbo.BookStatus ls 
     ON b.Id = bs.Id 
    WHERE (b.Id IN (SELECT BookId FROM dbo.BookActiveView WHERE UserId = @UserId AND ApplCd = 'BT')) 
    AND (b.Nbr LIKE @Nbr) <-- This is where it used to say (b.Nbr = @Nbr + '%') 
    ; 
+0

發佈您的代碼(ASP和SQL)。它是一個數字參數嗎? – Horaciux 2014-09-30 14:14:03

+1

'l.nbr = @Nbr +'%''只有在有匹配'123456%'的記錄時纔會返回'...'l.nbr LIKE @Nbr +'%''是將返回所有匹配記錄的代碼以'123456'開頭 – balexandre 2014-09-30 14:36:53

+0

我的歉意,但我輸入的代碼是(b.Nbr LIKE @Nbr)替換原來的(b.Nbr = @Nbr +'%')我錯過了上面的輸入。 asp:ControlParameter未正確地將字符串中的'%'傳遞給存儲過程。 – Troy 2014-09-30 17:22:26

回答

0

改變您的存儲過程:

SELECT 
    b.Id 
FROM dbo.Book b 
LEFT OUTER JOIN dbo.BookStatus ls 
    ON b.Id = bs.Id 
WHERE (b.Id IN (SELECT BookId FROM dbo.BookActiveView WHERE UserId = @UserId AND ApplCd = 'BT')) 
AND (b.Nbr LIKE @Nbr) <-- This is where it used to say (b.Nbr = @Nbr + '%') 

注意(b.Nbr LIKE @Nbr)這將表現爲你想要的@balexandre評論。

如果用戶只輸入「12345」,它會帶來完全匹配。如果他們輸入「12345%」,它會帶來所有先從12345

而且其他wildcards申請

相關問題