2012-02-21 16 views
1

SQLと同じ表記法を使用してSQL Serverのバインド変数を示すことができますか?つまり、?を使用する代わりに、0、:1です。バインド変数のオプション

私は検索しましたが、決定的なものは見つかりませんでした。現時点では、私のソリューションはバインド変数を使用して、Oracleでうまくいくデータベースで実行するステートメントに値を導入していますが、SQL ServerとPostGISでも同じことを行う必要があります。 *

switch(dialect) 
{ 
    case "Oracle": 
    { 
     oleDataBaseConnection.AddParameter(":1", coordsys); 
     break; 
    } 

    case "SQLServer": 
    { 
     oleDataBaseConnection.AddParameter("?", coordsys); 
     break; 
    } 
} 

AddParameter()私が書いた実行関数を呼び出すときにコマンドオブジェクトに追加するリストに値を追加私のラッパークラスからの機能である:私は、たとえば言わなければならないしたくありません。

私のコードはできるだけきれいで、上に示したようにハードコードされたものは含まないようにしたいと思います。私はすべてに合った解決策を望んでいます。 (はい、私はおそらく希望の思考であることを知っています!)

私はこれを行うために文字列を使用することができます知っているが、それは私が何をしていない。私は本当にそのような回避策を使用したくない。また、私のプロジェクトマネージャは、バインド変数を使って解決策を見つけようとしました。

アイデア?

答えて

1

短い答えはいいえ、バインド変数はさまざまなデータベースで異なって実装されています。だからあなたはどこか乱雑な互換性ロジックが必要になります。

つまり、私は個人的には、文字列置換を使用してバインドパラメータの正しい構文を入れてこの問題を解決しました。したがって、:coordsysをSQL文に埋め込み、コードにoleDataBaseConnection.AddParameter("coordsys", coordsys);を埋め込むことができます。あなたの準備文はSQLを検索し、:coordsysを探し、必要なもの(例えば?)で置き換えます。また、後で実行するために名前のパラメータリストを作成します。実行するとすぐに、使用するバインドパラメータの正しいリストを構築することができます。

舞台裏での実装はちょっと難しいですが、個人的には、バインドパラメータ(データベースのパフォーマンス、SQLインジェクション攻撃からのセキュリティなど)の利点を利用してクリーンなSQLにつながることがわかりました。

+0

私はあなたが意味するものを得ると思います。基本的には、コマンドにパラメーターを追加すると、ラッパークラスによって文字の置換が処理されます。だから私は今のように必要な方言をsimpyで検出し、正しい構文を入れますか?または:。 1つの問題は、私のデータベースの1つがバインド変数をまったくサポートしていない可能性があることです。私はこの場合、私のコードで文字列の置換をしなければならないだろうと思っていますが、手作業でバインド変数をサポートしていないことを知っていなければなりません。本当に面倒な作業です。 – CSharpened

+0

@CSは正確に訓練されています。しかし、この時点では、すべてのまともなデータベースドライバが何らかの形でバインド変数をサポートすることを期待しています。なぜなら、SQLインジェクション攻撃を避けるためには非常に重要だからです。 – btilly

+0

情報ありがとうございました。あなたの提案をうまく実装できるかどうかがわかります。それは私が必要と思っていたように思えますが、もう少し洗練された解決策があることを望んでいました。ありがとう。 – CSharpened