「Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
個別にDaoクラスを使用してデータ アクセスする場合、
インテリジェンスなD層(Dao)クラス として、機能毎に「自作Daoクラス」を実装。
/// <summary>「sp_help」ストアドプロシージャを実行する。</summary> /// <param name="objectName">「sp_help」ストアドプロシージャの「objname」パラメタに指定する文字列</param> /// <param name="ds">「sp_help」ストアドプロシージャが返す結果セット(複数返る)</param> /// <returns>「sp_help」ストアドプロシージャの戻り値(成功:「」、失敗:「」)</returns> public int sp_help(string objectName, out DataSet ds) { // ストアドプロシージャを指定する。 this.SetSqlByCommand("sp_help", CommandType.StoredProcedure); // CommandTypeにStoredProcedureを設定 // 引数パラメタを設定する。 this.SetParameter("objname", objectName); // 戻り値パラメタを設定する。 // 戻り値用のパラメタを指定する場合、Parameter.Directionプロパティに、ParameterDirection.ReturnValueを指定する。 // アウトプット パラメタを指定する場合も、同様に、Parameter.Directionプロパティに、ParameterDirection.Outputを指定する。 this.SetParameter("ret", null, null, -1, ParameterDirection.ReturnValue); // ストアドプロシージャを実行し、データリーダを戻す。 // ストアド プロシージャの実行には、this.ExecSelect_DR()メソッドを使用する。 SqlDataReader drd = (SqlDataReader)this.ExecSelect_DR(); // 結果セットを取得する ds = new DataSet(); // 結果セットは複数取得可能 // ループなどを使用して複数の結果セットを取得できる。 // DataTable.Load()メソッドでは、結果セットが自動的に次に送られる。 // DataTable.Load()メソッドを使用しない場合、DataReader.NextResult()メソッドを使用して、次に読む結果セットに進む。 do { // DataTableを生成 DataTable dt = new DataTable(); // データリーダから結果をロード dt.Load(drd); // DataTableを格納 ds.Tables.Add(dt); } while (!drd.IsClosed); // データリーダを閉じる。 drd.Close(); // ストアドプロシージャの戻り値パラメタの値を取得。 return (int)this.GetDam.GetParameter("ret").Value; }
汎用的なDaoクラスを使用して主に参照系のデータアクセス処理を実行する。
// 汎用Daoで参照系SQLを実行 CmnDao cmnDao = new CmnDao(this.GetDam()); // 動的SQLを指定 cmnDao.SQLFileName = "ShipperSelect.xml"; // パラメタ ライズド クエリのパラメタに対して、動的に値を設定する。 cmnDao.SetParameter("P1", testParameter.ShipperID); // 戻り値 dt DataTable dt = new DataTable(); // 汎用Daoを実行 cmnDao.ExecSelectFill_DT(dt);
<?xml version="1.0" encoding="shift_jis" ?> <ROOT> SELECT A, B, C FROM T WHERE <IF>AND A = @A</IF> <IF name="A_LIKE">AND A LIKE @LIKE_A</IF> <IF>AND B = @B</IF> <IF name="B_LIKE">AND B LIKE @LIKE_B</IF> <IF>AND C = @C</IF> ORDER BY <IF name="SEQUENCE">A<ELSE>B</ELSE></IF> </ROOT>
' ファイルから読み込む Me.SetSqlByFile2("XXX.xml") ' パラメタ設定 ' パラメータA If PV.A <> "" Then If PV.A_IsAimai Then ' LIKE前方一致検索 Me.SetParameter("LIKE_A", PV.A & "%") Else ' 通常の=一致検索 Me.SetParameter("A", PV.A) End If End If ' パラメータB If PV.B <> "" Then If PV.B_IsAimai Then ' LIKE前方一致検索 Me.SetParameter("LIKE_B", PV.B & "%") Else ' 通常の=一致検索 Me.SetParameter("B", PV.B) End If End If ' パラメータC Me.SetParameter("C", PV.C) ' 並び順 Me.SetParameter("SEQUENCE ", PV.SEQ) ' 結果セットの取得 RV.dt = New DataTable() Me.ExecSelectFill_DT(RV.dt)※ LIKE句で使用する、「 % 」や「 _ 」などのワイルドカードを
// 汎用Daoでストアドを実行 CmnDao cmnDaoSP = new CmnDao(this.GetDam()); // ストアドを指定 cmnDaoSP.SQLText = "sp_help"; // パラメタを指定する(入力、出力)。 cmnDaoSP.SetParameter("objname", "Shippers"); cmnDaoSP.SetParameter("ret", null, null, -1, ParameterDirection.ReturnValue); // 汎用Daoを実行 SqlDataReader drd = (SqlDataReader)cmnDaoSP.ExecSelect_DR(); // 結果セットを取得する DataSet ds = new DataSet(); // 結果セットは複数取得可能 do { // DataTableを生成 DataTable dt = new DataTable(); // データリーダから結果をロード dt.Load(drd); // DataTableを格納 ds.Tables.Add(dt); } while (!drd.IsClosed); // データリーダを閉じる。 drd.Close(); // 戻り値を取得 int i = (int)cmnDaoSP.GetParameter("ret");
自動生成したDaoクラスを使用してデータ アクセスする場合、
汎用的なDaoクラス、自動生成したDaoクラスを集約する場合、
/// <summary>Dao集約クラスのベースクラスの例</summary> public class BaseConsolidateDao { /// <summary>データアクセス制御クラス</summary> private BaseDam _dam; /// <summary>データアクセス制御クラス</summary> protected BaseDam Dam { get { return this._dam; } } /// <summary>コンストラクタ</summary> /// <param name="dam">データアクセス制御クラス</param> public BaseConsolidateDao(BaseDam dam) { this._dam = dam; } }
以下のメソッドを使用してデータアクセスを行う。