2011-10-29 5 views
1

このコードを正しく作成するにはどうすればよいですか?私はこのコードに満足していない、私は失われています。コードビハインドで条件付きのクエリを作成する最も良い方法は?

私はあなたに簡単な例を示しますが、クエリはより複雑です。

ありがとうございます。 JavaやC#(およびほとんど他のプラットフォーム)の両方で

string aValue; 
string queryA; 
string queryB; 
string finalQuery; 

string queryA = @"SELECT column1 FROM table1 WHERE column1="; 
queryA += aValue; 

string queryB = @"SELECT column1, column2," 

if (aValue == "all"){ 
    queryB += @"column3"; 
} 
queryB += @"FROM table1 WHERE column1="; 
queryB += @"'" +aValue+ "'"; 

private void exportExcel(){ 

    // change the value with a dropdownlist 
    if (ddlType.selectedIndex(1)) 
      aValue = "typeA"; 
    else if(ddlType.selectedIndex(2)) 
      aValue = "typeB"; 
    else 
     aValue = "all"; 

    // select the query 
    if (aValue == "typeA") 
     finalQuery = queryA; 
    else if (aValue == "typeB") 
     finalQuery = queryB; 

    ExecQUery(finalQuery); 
} 

答えて

3

あなたは間違いなくないは、SQLで直接値を含める必要があります。これはSQLインジェクション攻撃への道を開き、日付、時間、数字の書式設定を扱いにくくします。

代わりに、パラメータ化された SQLを使用して、パラメータの値を指定する必要があります。あなたはそれをどのように行うのかはJavaとC#によって異なりますが、原則は同じです。

両方のプラットフォーム上の別のアプローチではなく、手でクエリを構築するよりも、いくつかの説明のORMを使用することです。たとえば、.NETではいくつかの説明のLINQプロバイダを使いたいかもしれず、JavaではHibernateのようなものを使いたいかもしれません。いずれにしても、未処理のSQLだけでなく抽象度の高いレベルでクエリを表現することができます。

それはあなたが本当に見に使用して(またはデータベース)と実際のクエリなしているもののプラットフォームを知らなくてもはるかに具体的な助言を与えることは難しいです。

+0

はい、私は、 "パラメータ化されたSQL" を使用して、我々はORMを持っていません。私は、おそらく知られている悪い習慣を使用して例を与える – TimeIsNear

+0

@ user359706:コードをformatingするためのアドバイス、おそらくクエリを構築するための他の関数を使用する必要がありますか?そして、あなたは「私たちはORMを持っていません」と言っていますが、ORMを使用しないのはなぜですか?あなたはコードを改善する方法を尋ねました。そして、ORMを使用することがその方法の1つです。 –

+0

大きなプロジェクトなのでORMは使用しません。すべてを変更する方が複雑です。しかし、私はコードplzを再編成するためのアドバイスが必要です。 – TimeIsNear

0

通常、リソースファイルからロードします。これにより、クエリを変更する自由が得られます(ifブロックを使用して動的に生成する必要がない場合)。ソースコードでは私のようなのようなもので、それすべてを連結または置くために私のIDEを避けるために、コメント行と私の行を終了書式設定使用:

String sql = "select " + // 
    " * " + // 
    "from "+ // 
    " employee " + // 
    "where " + // 
    "  salary > :minSal " + // 
    " and startDate > :minStartDate"; 

そして、条件部分の場合、私はちょうど場合にそれを追加しますブロック。しかし、whereステートメントの場合、追加の制限を続行するために1つのデフォルト "1 = 1"を追加するだけです。したがって、追加の制限がない場合でもクエリは有効です。 SQL怒鳴る内の文を条件付きで追加された両方の場所と仮定します。

String sql = "select " + // 
    " * " + // 
    "from "+ // 
    " employee " + // 
    "where 1 = 1 "; 

ここまではあなたがいない条件が追加された場合、それはまだ有効になることを意味し、有効な、お使いのベースのSQLを持っています。

は、それが通知された場合は、念のために給与の制限を追加するとします

if (salary != null) { 
    sql += "and salary > :minSalary"; 
    parameters.put("minSalary", salary); 
} 

あなたが同じ状態で見ることができるように私はなりマップに私のSQLへの新しい表現とパラメータを追加しますこのパラメータを設定するために2番目のif文を作成するのを避けるために、後でexecuteでパラメータをクエリに設定するために使用します。あなたが取ることができる

別のアプローチは、全体のSQLを構築し、実行する前に、それは、入力として必要とそれらを提供するパラメータプリペアドステートメントをお願いしています。、私はそうではありません知っているが、ORMを使用する場合は、クエリのビルダーを持っているのが一般的であり、これは、この作業は非常に簡単になります http://download.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html#getParameterMetaData%28%29

休止状態で、たとえば、あなたが何かを持っている可能性があります。javaであなたがそれを行うことができます以下のような:

List cats = sess.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "F%") 
    .addOrder(Order.asc("name")) 
    .addOrder(Order.desc("age")) 
    .setMaxResults(50) 
    .list(); 

で文書化されたよう:

Criteria c = sess.createCriteria(Cat.class) 
    .addOrder(Order.asc("name")) 
    .addOrder(Order.desc("age")) 
    .setMaxResults(50); 
if (name != null) { 
    c.add(Restrictions.like("name", name); 
} 
List cats = c.list(); 
:あなたがこれを行うことが意味することに http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

0

ドロップダウンリストの値属性をtypeA、TypeBなどに設定し、初期のif条件と変数を取り除くことができます。

例:実際に

if(ddlType.selectedValue.toString()=="typeA") 
    finalQuery = queryA; 
if(ddlType.selectedValue.toString()=="typeB") 
    finalQuery = queryB; 
+0

ありがとうarjunshetty、それは私が待っているこの種のアドバイスです! – TimeIsNear

関連する問題