2012-03-21 10 views
0

もう一つ迷惑なものですが、おそらく単純なものです。SQLパラメータをプログラムで作成する

私はユーザー入力に基づいてクエリの可能なwhere節をいくつか持っていますが、私はこれらをプログラムで追加できますか?例えば

wherequery = @"WHERE fieldname = @p_FieldName AND "; 
if (txtValue.textLength > 0){ 
    wherequery += "fieldname2 = @p_FieldName2 AND "; 
} 
query = @"SELECT * FROM tabe" + wherequery; 
sql = connection.CreateCommand(); 
sql.CommandText = query; 

がどのように私はそのためのパラメータをやって行くのでしょうか? ArrayLists、Dictionariesなどいくつかのメソッドを試しましたが、その方法を見つけることができません。

SqlParameter[] sqlparams; 
wherequery = @"WHERE fieldname = @p_FieldName AND "; 
if (txtValue.textLength > 0){ 
    wherequery += "fieldname2 = @p_FieldName2 AND "; 
    sqlparams.Parameters.Add("@p_FieldName2 ", SqlDbType.VarChar).Value = txtValue.text; 
} 
query = @"SELECT * FROM tabe" + wherequery; 
sql = connection.CreateCommand(); 
sql.CommandText = query; 
sql.Parameters.Add(sqlparams); 

答えて

1

私はうまくいけば、正しい方向にあなたを指している必要がありますされ、あなたのコードに小さな変更を加えました:

sql = connection.CreateCommand();  
    wherequery = @"WHERE fieldname = @p_FieldName "; 
    sql.Parameters.Add(new SqlParameter("@p_FieldName ", "some value for fieldname")); 

    if (txtValue.textLength > 0){ 
     wherequery += " AND fieldname2 = @p_FieldName2 "; 
     sql.Parameters.Add(new SqlParameter("@p_FieldName2 ", txtValue.text)); 
    } 
    query = @"SELECT * FROM tabe" + wherequery; 

    sql.CommandText = query; 
+1

'Add'メソッドのパラメータを変更しましたか?私は主にWeb開発者ですが、これは 'AddWithValue'ではありませんか?そして、これはどのように変化しますか? – Curt

+0

SqlParameterオブジェクトのインスタンス化を忘れました。私は適切な編集をしました。 –

0

文字列部分がキーであり、オブジェクトの部分が値であるDictionary<string,object>を使用します。理想的には私はこのような何かをしたいと思います。

-2

なぜLinq to SQL/Enties、NhibernateなどのORMを使用しないのですか?

手動でSQL文を生成するのは少し古くなっているので、

1

プログラムでパラメータを追加するのではなく、すべてを追加しますが、NULL条件を含めます。たとえば、次のようにtxtValueのテキストの長さが0であればここで

SELECT * FROM tabe 
WHERE [email protected]_FieldName 
AND (@p_FieldName2 IS NULL OR [email protected]_FieldName2) 

sqlparams.Parameters.Add("@p_FieldName2 ", SqlDbType.VarChar).Value = null; 
if (txtValue.textLength > 0){ 
    sqlparams.Parameters("@p_FieldName2").Value = txtValue; 
} 

は、その後、@p_FieldName2パラメータがnullに設定されています。値がNULLの場合

は、次にSQLクエリに以下は[email protected]_FieldName2を無視します:

@p_FieldName2 IS NULL OR 
+0

これはサーバーにクエリを処理するための追加負荷を招き、このサーバーはすでに最後の足にあります。( – Neo

+3

投票しました。追加負荷がどのように追加されるのかわかりません。より効率的です。解析する必要がある複数の並べ替えではなく、1つの実行計画で1つのクエリを取得できます。 –

+0

あなたは30の可能な句、thats 30ヌル値を持っていると仮定します。また、同じフィールドを異なる方法で日付フィールドのように使用する必要がある場合はどうしますか? – Neo

2

はこの質問への答えをチェックしてください。あなたの問題に適用できるはずです。

How to handle dynamic sql parameters

+0

これは私にはかなりいいようです。 – Yatrix

+0

正直なところ、私は同じことをするストアドプロシージャを使用するようにこの構造全体を変更します。可能なすべてのパラメータを作成します。その中には、テーブルと同じ数の列しか存在しないものがあります。 WHERE節でWHERE column1 = ISNULL(@ column1、column1)とcolumn2 = ISNULL(@ column2、column2)などを使用します。 –

0

あなたがフィルタリングする異なる可能なフィールドの束を持っている場合は、あなたはそれらをすべて、ある意味で、あるいは別の方法でコーディングすることから逃れることはありません。

文字列の作成を処理するクラスを作成できます。私は仕事からこのアイデアを盗んだ。 =)

擬似コードでは、それは基本的に次のようになりたい:これは、コードへの本当の簡単なクラスでなければなりません

Class WhereObj 
{ 
    //whatever container you want to use to hold the params 
    //you could also create a params class and have a list of param objects 
    //it'd basically be a constructor and two properties 

    private Params(,) 

    Public void AddParam(fieldname, value) 
    //adds param to Params 

    Public string ToSQLString() 
    //loops params and builds string (use stringbuilder!) 
    //ex: "where FirstName= 'Neo' and MatrixSequelsSucked = 'true'" 
} 

- おそらく50行の下に。複数の場所でこれを行う必要がある場合は、特にを処理するために、自分でオブジェクトを作成する必要があります。 1つの場所にしか存在しない場合は関数を書くことができますが、オブジェクトに分割するのはちょっときれいだと思います。

関連する問題