我正在使用Visual Web Developer 2008 EE使用数据集(.xsd)开发开发票应用程序,并且在创建自定义搜索查询时遇到问题。 我有预计4个ControlParameters,像这样一个ObjectDataSource:ObjectDataSource和null参数
<asp:ObjectDataSource ID="odsInvoices" runat="server" SelectMethod="getInvoices" TypeName="bllInvoice">
<SelectParameters>
<asp:ControlParameter ControlID="drpProjectsFilter" Type="Int32" Name="intProject" PropertyName="SelectedValue" ConvertEmptyStringToNull="True" />
<asp:ControlParameter ControlID="drpMonthsFilter" Type="Int32" Name="intMonth" PropertyName="SelectedValue" ConvertEmptyStringToNull="True" />
<asp:ControlParameter ControlID="drpYearFilter" Type="Int32" Name="intYear" PropertyName="SelectedValue" ConvertEmptyStringToNull="True" />
<asp:ControlParameter ControlID="drpStatusFilter" Type="Int32" Name="intStatus" PropertyName="SelectedValue" ConvertEmptyStringToNull="True" />
</SelectParameters>
对于每个这些控件(下拉菜单)我有“的缺省值的”(=空字符串)和我已经添加了选项ConvertEmptyStringToNull =”真“的每个参数。 是ObjectDataSource控件背后的查询是这样的一个:
SELECT ... FROM ...
WHERE (YEAR(invoices.invoice_date) = COALESCE (@year, YEAR(invoices.invoice_date)))
AND (invoices.fk_project_id = COALESCE (@projectID, invoices.fk_project_id))
AND (MONTH(invoices.invoice_date) = COALESCE (@month, MONTH(invoices.invoice_date)))
AND (invoices.invoice_status = COALESCE (@statusID, invoices.invoice_status))
使用COALESCE,我基本上说忽略任何4个参数,如果他们为空和返回所有行。
问题是,这个查询不会返回任何行,除非我为4个参数中的每一个指定了一个值,基本上揭穿了这个自定义搜索的整个目的。
任何想法,为什么这不工作? 在此先感谢!
谢谢伊恩,但我最初与ISNULL尝试这样做,也没有工作。另外,我想避免使用ISNULL,因为它仅在T-SQL中受支持,并且谁知道我们将来可能会更改我们的DB提供程序。 – 2009-10-20 09:40:51
在这种情况下,我只能建议SQL Profiler :)。我在Mono中忽略了'ConvertEmptyStringToNull'被忽略的问题,但我怀疑它适用于你的情况。 – 2009-10-20 10:42:35
看看我的答案SQL在http://stackoverflow.com/questions/1493458/search-based-on-matched-criteria/1493643#1493643我认为这将做你想做的事情,可能会更多一点便携。 – PhilPursglove 2009-10-20 14:20:35