変数オプションをバインドします
-
28-10-2019 - |
質問
Oracle IE:0、:1を使用する代わりに同じ表記を使用して、SQL Serverのバインド変数を示すことは可能ですか?
私は検索しましたが、これについて決定的なものは見つかりませんでした。現時点では、私のソリューションはバインド変数を使用して、Oracleでうまく機能するデータベースで実行されているステートメントに値を導入しますが、SQL ServerとPostGISでも同じことをする必要があります。たとえば、言いたくない:
switch(dialect)
{
case "Oracle":
{
oleDataBaseConnection.AddParameter(":1", coordsys);
break;
}
case "SQLServer":
{
oleDataBaseConnection.AddParameter("?", coordsys);
break;
}
}
*addParameter()は、私が書いた実行機能を呼び出すときにコマンドオブジェクトに追加される値に値を追加するラッパークラスの関数です。
上記のように、コードをできるだけきれいにし、ハードコーディングされたものを含めないようにしたいと思います。すべてに合ったソリューションが欲しいです。 (はい、私はこれがおそらく希望的な考えであることを知っています!)
私はこれを行うために文字列置換を使用できることを知っていますが、それは私が望んでいるものではありません。私はそのような回避策を本当に使いたくありません。また、私のプロジェクトマネージャーは、バインド変数を使用してソリューションを見つけようとするように要求しました。
何か案は?
解決
短い答えはいいえ、バインド変数は異なるデータベースで異なる方法で実装されています。したがって、どこかに乱雑な互換性ロジックが必要です。
とはいえ、私は個人的にこの問題を過去に解決し、文字列置換を使用してバインドパラメーターに適切な構文を入力しました。したがって、埋め込むことができます :coordsys
SQLステートメントで、そして oleDataBaseConnection.AddParameter("coordsys", coordsys);
あなたのコードで。準備ステートメントはSQLを検索し、検索します :coordsys
必要なものに置き換えます(たとえば ?
)、また、後の実行の名前でパラメーターのリストを作成します。実行に移動すると、使用するバインドパラメーターの適切なリストを作成できます。
舞台裏のビットを実装するのは少し難しいですが、Bindパラメーター(データベースのパフォーマンス、SQLインジェクション攻撃からのセキュリティなど)の利点により、クリーンなSQLにつながることが個人的にわかりました。