J'utilise Visual Web Developer 2008 EE à l'aide d'un jeu de données (.xsd) pour développer une application de facturation et j'ai de la difficulté à créer une requête de recherche personnalisée. J'ai un ObjectDataSource qui attend 4 ControlParameters, comme ceci:ObjectDataSource et les paramètres 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>
Pour chacun de ces contrôles (listes déroulantes) J'ai une valeur par défaut de « » (= chaîne vide) et je l'ai ajouté l'option ConvertEmptyStringToNull = » True "pour chaque paramètre. La requête qui est derrière le ObjectDataSource est celui-ci:
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))
En utilisant COALESCE, je suis essentiellement dire d'ignorer l'un des 4 paramètres si elles sont nulles et de retourner toutes les lignes.
Le problème est que cette requête ne renvoie aucune ligne, à moins que je ne spécifie une valeur pour chacun des 4 paramètres, essentiellement démystifier le but entier de cette recherche personnalisée.
Vous ne savez pas pourquoi cela ne fonctionne pas? Merci d'avance!
Merci Ian, mais j'ai d'abord essayé avec ISNULL et il ne fonctionnait pas. Aussi, je veux éviter d'utiliser ISNULL car il est seulement supporté par T-SQL, et qui sait que nous pourrions changer notre fournisseur de BD à l'avenir. –
Dans ce cas, je ne peux que suggérer SQL Profiler :). J'ai rencontré des problèmes avec 'ConvertEmptyStringToNull' étant ignorés dans Mono, mais je doute que cela s'applique à votre situation. –
Jetez un oeil à l'SQL dans ma réponse à http://stackoverflow.com/questions/1493458/search-based-on-matched-criteria/1493643#1493643 qui je pense fera ce que vous voulez et peut-être un peu plus portable. – PhilPursglove