Хорошо, надеюсь, вы еще не решили эту проблему, потому что я потратил несколько минут на то, чтобы найти пример, который, я думаю, сделает в значительной степени то, что вы хотите.
Доступ к БД использует хранимую процедуру, но вы можете использовать ObjectDataSource с DAL или просто встроить оператор SQL в SqlDataSource и т. Д.
Markup:
Product ID:
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" ControlToValidate="TextBox1" runat="server" ErrorMessage="You must enter a number"
ValidationGroup="vg1" Type="Integer" Operator="DataTypeCheck"></asp:CompareValidator>
<br />
Description:
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><br />
<asp:Button ID="cmdSearch" runat="server" Text="Search" ValidationGroup="vg1" /><br />
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" SelectCommand="spGetProducts"
CancelSelectOnNullParameter="False" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="TextBox1" PropertyName="Text" DbType="String" DefaultValue="" />
<asp:ControlParameter ControlID="TextBox2" PropertyName="Text" DbType="Int32" DefaultValue="" />
</SelectParameters>
</asp:SqlDataSource>
И T-SQL для вашего запроса:
CREATE PROCEDURE spGetProducts
@ProductId int = NULL
,@ProductDescription nvarchar(100) = NULL
AS
BEGIN
SELECT [ProductId]
,[ProductDescription]
FROM [Products]
WHERE (
(
(@ProductId IS NULL)
OR
([ProductId] LIKE % + @ProductId + %)
)
AND
(
(@ProductDescription IS NULL)
OR
([ProductDescription] LIKE % + @ProductDescription + %;)
)
);
END
Если пользователь ничего не вводит ни в одно из полей, SqlDataSource все равно будет привязан из-за SqlDataSource.CancelSelectOnNullParameter = False
, но пустой параметр не будет отправлен с запросом из-за установленного ControlParameter.DefaultValue
. Затем хранимая процедура вставит значение NULL в параметр и пропустит эту часть фильтрации в предложении WHERE.
Надеюсь, это поможет.