「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;
}
}以下のメソッドを使用してデータアクセスを行う。