У меня есть страница, где есть текстовое поле, в котором пользователь может ввести поисковое значение, и запрос, который затем встраивает его в оператор LIKE.
Оставляя кучу сложности, это по сути this:
<div>
<asp:TextBox id="txtKey" runat="server" Width="300px" placeholder="Name" />
<asp:Button ID="btnSearch" Text="Search" runat="server" />
</div>
<div>
<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False"
DataSourceID="ds1">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<%# Eval("name") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</div>
<asp:SqlDataSource ID="ds1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
selectcommand="select a.id, a.name
from mytable a
where a.name like '%'+@search+'%'
order by a.name">
<SelectParameters>
<asp:ControlParameter Name="search" ControlID="txtKey" PropertyName="text" DbType="String" DefaultValue="%" />
</SelectParameters>
</asp:SqlDataSource>
Если я не включу DefaultValue в параметр или не установлю для него пустую строку, то, если текстовое поле пустое, это возвращает ноль записей. Но если я добавлю значение по умолчанию «%», то он вернет все записи в таблице, чего я и ожидаю. Если я введу значение в текстовое поле, то оно возвращает записи, которые содержат это значение в любом месте поля имени, как я и ожидал.
Почему мне нужно указать DefaultValue = "%"? Если значение в текстовом поле пустое, я должен искать по имени, например «%%», которое должно соответствовать всем записям. Я попробовал это, просто запустив его как отдельный запрос, и он прекрасно работает.
Если я ничего не набираю в текстовом поле, значение должно быть пустой строкой. Вот что я получу, если получу значение в коде. Я подумал, что на самом деле это может быть null, поэтому я попытался изменить where на «where @search равно нулю или на имя, подобное«% »+@search+ '%'», и это тоже не сработало.
Так что ладно, установка DefaultValue = "%" работает. Но я не понимаю почему. И «Это работает, но я не знаю почему» только немного лучше, чем «Это не работает, и я не знаю почему». : -0