我有一个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 + '%' )
;
答案 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适用