このような設計の問題は、セキュリティとSQLインジェクションの防止のためのベストプラクティスを使用することが非常に難しいことです。純粋なSQLステートメントを関数に渡すと、慎重に行わない限り、SQLインジェクションを防御する機能がほとんどなくなります。
原則として、ユーザー入力を取り込む場合は、パラメーター化されたストアドプロシージャ、またはパラメーター化されたクエリのいずれかを使用していることを確認する必要があります。推奨されるパターンは、ステートメントと、正しい数のパラメーター値を含むオブジェクト型の配列を渡し、関数にパラメーターコレクションを作成することです。
パターンとプラクティスライブラリのMicrosoftデータアプリケーションブロックを使用します。これには、これを非常に簡単にする機能が含まれています。
これを使用する場合、ConnectionStringはapp.configまたはweb.configに保存され、接続文字列のNAMEを渡すと、データアプリケーションブロックコードがそれを検索し、コマンドを作成し、接続し、クエリ。
このパターンを使用すると、コードは次のようになります。
public static DataSet ExecuteDataset(string CallingApp, string ConnectionStringName, string StoredProcName, object[] ParameterValues)
{
DataSet ReturnValue = new DataSet();
Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(ConnectionStringName);
try
{
ReturnValue = db.ExecuteDataSet(StoredProcName, ParameterValues);
}
catch (Exception ex)
{
// a bunch of code for exception handling removed
}
return ReturnValue;
}
これは、DataSetを取得するためのコードです。利用できる関数は他にもたくさんあり、このコードは最新バージョンのデータアクセスライブラリでは機能しない可能性があります。少し古いバージョンを使用していますが、これにより、使いやすさがわかります。