0

私にとってもう1つの厄介なものですが、おそらく単純なものです。

ユーザー入力に基づくクエリの 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);
4

6 に答える 6

2

この質問に対する答えを確認してください。あなたの問題に当てはまるはずです。

動的 SQL パラメータの処理方法

于 2012-03-21T16:31:49.540 に答える
1

パラメータをプログラムで追加するのではなく、それらをすべて追加しますが、NULL 条件を含めます。例えば:

SELECT * FROM tabe
WHERE fieldname=@p_FieldName 
AND (@p_FieldName2 IS NULL OR fieldname2=@p_FieldName2)

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

ここで、 のテキスト長txtValueが 0 の場合、@p_FieldName2パラメータは に設定されnullます。

次に、SQL クエリでfieldname2=@p_FieldName2、値が NULL の場合、次は無視されます。

@p_FieldName2 IS NULL OR 
于 2012-03-21T16:28:01.850 に答える
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;
于 2012-03-21T16:32:28.917 に答える
0

Dictionary<string,object>文字列部分がキーで、オブジェクト部分が値であるa を使用します。

于 2012-03-21T16:26:32.733 に答える
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 か所にしかない場合は関数を書くこともできますが、オブジェクトに分けた方が少しすっきりすると思います。

于 2012-03-21T17:26:54.977 に答える
-2

Linq のような ORM を SQL/Enties、Nhibernate などに使用してみませんか?

SQL ステートメントを手動で生成するのは少し時代遅れだからです。

于 2012-03-21T16:27:42.363 に答える