2009-07-15 3 views
4

アイテムを検索するための検索画面があるとします。画面にはさまざまなオプションの検索オプションがあり、SQLクエリー・ステートメントが変化します。ここ<= Nパラメータを受け入れるパラメータ化クエリまたはストアドプロシージャを作成する方法はありますか?

いくつかの例示的な検索である:

  1. 説明検索
  2. 説明Search +アイテムサプライヤID
  3. 説明Search +アイテムサプライヤID +アイテムの階層レベル1 ID
  4. 説明Search +アイテムサプライヤーid +アイテム階層レベル1 id +レベル2 id
  5. アイテム階層レベル1 id +レベル2 id(説明なし、アイテムサプライヤIDなし)

...あなたはアイデアを得る。かなり多くの組み合わせが可能です。私は、パフォーマンス上の利点などのためにパラメータ化されたクエリを使用することを望んでいました(そして、私はプログラム全体でクエリの残りの部分を使用しています)。

これを行う方法はありますか、またはSQLiteCommandオブジェクトと一致する各クエリを作成するか、選択したオプションに基づいてStringBuilderを使用してクエリ文字列を動的に作成する必要がありますか?

私は3.5コンパクトフレームワーク上のC#3.0でSQLite.NETデータプロバイダを使用しています。


UPDATE

パラメータと(@param isnull or column = @param)を使用するためのnullデフォルト値を持つ提案のいくつかに基づいて、私はこの作業を取得することができるはずだと思います。私はあなたの投稿を続けます。

注:コードの残りの部分がストアドプロシージャの代わりにパラメータ化されたクエリを使用するため、ストアドプロシージャの使用を避けています。私は将来のメンテナンスプログラマーの健全性のためにすべてを一貫して保っていきたいと思っています。とにかくあまり差をつけすぎてはいけません。


UPDATE 2

これは(私は、クエリのための私の最初のテストをしたところである)デスクトップシステム上大きなを働きました。しかし、使用していたWindows CEデバイスでは非常に遅いです。まれに遅い。すべて同じ、私は間違いなく将来これを使うことができ、とても便利です。モバイルデバイスでクエリを実行しているときだけではありません。

ありがとうございました

+0

私はあなたのクエリを動的に構築する方法を示しますが、パラメータ注入警察は私の後になります。 –

+0

質問のタイトルは可変数のパラメータを示します。しかし、N個のパラメータを持つが、N個または shahkalpesh

+0

@Robert)おそらく –

答えて

4

ストアドプロシージャの側からは、句が、このNULL値に対応するためにどこを構築、その後nullに値をデフォルトすることができます。

ALTER Procedure FooProcedure 
    @SupplierID INT = NULL, 
    @LevelOne INT = NULL 
AS 
BEGIN 

    SELECT SupplierID, LevelOne 
     FROM FooTable 
    WHERE @SupplierID IS NULL OR SupplierID = @SupplierID 
     AND @LevelOne IS NULL OR LevelOne = @LevelOne 

END 
+0

これは有望に見えます。今私はストアドプロシージャではなく、パラメータ化されたクエリで私のC#コードで同じことをすることができるのだろうかと思う(他のコードのどれもが...一貫性がいいと思うので私ができるならばSPを避けたい)。 –

+0

@Jason:C#の場合、あなたはその場合にオーバーロードを使うことができると思います。構造体にNullable型を使用できます。 VB.netはオプションの引数をサポートしています(オーバーロードに対してオプションのパラメータを持つ1つのメソッドを持つことができます)。 – shahkalpesh

+0

あなたの検索が同じデータ構造を返し、既知のオプションパラメータのセットを受け入れる場合、この答えはむしろ標準的なアプローチです。あなたは多くのパラメータを持っている場合 –

0

それぞれのケースでストアドプロシージャを作成するのが最適でしょう。

StringBuilderで構築されたC#にインラインSQLコードがある場合、実行プランはキャッシュされず、ストアドプロシージャと同様に機能しません。あなたは、パラメータのデフォルト値を代入して、ストアドプロシージャ内のロジックを処理することができます

+1

これが私がパラメータ化されたクエリを作成した理由です。彼らはまたキャッシュされます。独自のSQLiteParameterオブジェクトを持つSQLiteCommandオブジェクトがあるので、クエリが実行されるとキャッシュされるはずです。問題は、このアプローチを使用するには、すべての可能な検索の組み合わせに対して1つ必要となることです。私はストアドプロシージャを使用して同じ問題に遭遇すると思います...可能な検索組み合わせごとに1つ必要です。これは私が避けようとしていることです。 –

+0

キャッシュの実行計画もあまりにも、それともデータだけですか? – NikolaiDante

+0

私はそれが全体の実行計画だ印象の下だ(私が間違っている可能性が)。 –

1

create procedure mySproc(@description nvarchar(20) = null, @supplierid int = null, etc...) 

は、パラメータがSPROCのボディにヌルであるかどうかのロジックを処理します。

関連する問題