2

データセット (.xsd) を使用して Visual Web Developer 2008 EE を使用して請求アプリケーションを開発していますが、カスタム検索クエリの作成に問題があります。次のように、4 つの ControlParameters を期待する ObjectDataSource があります。

<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="True" を追加しました。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 つのパラメーターが null の場合は無視し、すべての行を返すように言っています。

問題は、4 つのパラメーターのそれぞれに値を指定しない限り、このクエリが行を返さないことです。これは、本質的に、このカスタム検索の目的全体を暴くものです。

これが機能しない理由について何か考えはありますか? 前もって感謝します!

4

2 に答える 2

1

私は自分の問題を解決することができました。結局のところ、ControlParameters は (dbnull 値のように) NULL を返しませんでしたが、実際の数値は 0 です。SQL ステートメントを次のように調整しました。

select ...  from ... 
where ((@year=0) OR (year(invoices.invoice_date)=@year)) 
and ((@projectID=0) OR (invoices.fk_project_id=@projectID))   
and ((@month=0) OR (month(invoices.invoice_date)=@month))
and ((@statusID=0) OR (invoices.invoice_status=@statusID))

このように、ControlParameter の値が 0 の場合でも、すべての行が返されます。これが誰かを助けることを願っています。

よろしく、 スタイン

于 2009-10-20T15:31:07.137 に答える
1

MSSQL ドキュメントから:

ISNULL と COALESCE は同等ですが、動作が異なる場合があります。null 以外のパラメーターを持つ ISNULL を含む式は NOT NULL と見なされますが、null 以外のパラメーターを持つ COALESCE を含む式は NULL と見なされます。

したがって、クエリを次のように変更してみてください。

select ...
  from ...
 where year(invoices.invoice_date)  = isnull(@year, year(invoices.invoice_date))
   and invoices.fk_project_id       = isnull(@projectID, invoices.fk_project_id)
   and month(invoices.invoice_date) = isnull(@month, month(invoices.invoice_date))
   and invoices.invoice_status      = isnull(@statusID, invoices.invoice_status)

それが機能しない場合は、SQL プロファイラーを使用して、SELECT呼び出されたときに何が渡されているかを正確に確認します。

于 2009-10-20T09:04:09.287 に答える