无法使用asp:ControlParameter将通配符传递给存储过程

时间:2014-09-30 14:01:05

标签: sql asp.net sqldatasource

我有一个aspx页面,允许用户输入字符串asp:ControlParameter,然后使用SelectCommand将其传递给存储过程。

问题是如果用户在文本框中输入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 + '%' )
    ;

1 个答案:

答案 0 :(得分: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所说的那样表现。

如果用户仅输入&#39; 12345&#39;它会带来完全匹配。如果他们键入&#39; 12345%&#39;它会带来所有从12345开始的

其他wildcards适用