多くのパラメーターを持つ挿入ステートメントを書くための洗練された方法はありますか?DBに保存する必要のある20個のフラグに加えて、それらの20個のフラグとともに挿入する必要のあるその他の情報があります。その挿入に30個のパラメーターを使用してメソッドを作成するのは時間の無駄ですが、これまでのところ、うまくいく可能性のある他のアイデアは思いつきません。
5 に答える
これらすべてのパラメーターをオブジェクトに入れ、そのオブジェクトをメソッドに渡すことができます。
標準的なアプローチは、エンティティを表すクラスを作成し、そのクラスのインスタンスを渡すことです。
これにより、永続化だけでなく、検証、プレゼンテーションなどを行う可能性のある他のメソッドに簡単に渡すことができます。
Sachin に同意し、必要な SqlParameters のリストをクラス内にカプセル化し、
次に、インスタンスをデータレイヤーに渡して、SQL クエリをさらに処理します。
getFields などのメソッドを公開する Iinsertable など、データベースに挿入できるオブジェクトのタイプを表すインターフェイスを作成できます。これで、このインターフェイスを実装するエンティティを作成します。
これらのエンティティを使用して、データベース層で Iinsertable をパラメーターとして受け入れるジェネリック メソッドを作成できます。これは、ループ内の getFiels メソッドで挿入されるすべてのフィールドを照会します。これにより、コードはあらゆるタイプのエンティティで再利用可能になり、非常にクリーンになります。
私の SqlBuilder クラスを使用します。これにより、パラメーターの作成やその名前について心配することなく、パラメーター化されたクエリを作成できます。
var bldr = new SqlBuilder( myCommand );
bldr.Append("SELECT * FROM CUSTOMERS WHERE ID = ").Value(myId, SqlDbType.Int);
//or
bldr.Append("SELECT * FROM CUSTOMERS NAME LIKE ").FuzzyValue(myName, SqlDbType.NVarChar);
フラグは好きなだけ持つことができます。クエリにランタイム値を含めるたびに Value() を呼び出すだけです。パラメーターの作成は非表示になり、きちんとした SQL クエリが残ります。
SqlBuilder クラスのコードはこちら