「Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
名前バインドにのみ対応しています。このため、どのデータプロバイダであっても、順番バインドをサポートしません。
public class GenDaoParam { public object Value; public object DbType; public int Size; public ParameterDirection Direction; }
ストアド プロシジャでも動的パラメタライズド・クエリ機能を使用できます。
ストアド プロシージャの実行も可能である。
/// <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); // 引数パラメタを設定する。 this.SetParameter("objname", objectName); // 戻り値パラメタを設定する。 this.SetParameter("ret", null, null, -1, ParameterDirection.ReturnValue); // ストアドプロシージャを実行し、データリーダを戻す。 SqlDataReader drd = (SqlDataReader)this.ExecSelect_DR(); // 結果セットを取得する ds = new DataSet(); // 結果セットは複数取得可能 do { // DataTableを生成 DataTable dt = new DataTable(); // データリーダから結果をロード dt.Load(drd); // DataTableを格納 ds.Tables.Add(dt); } while (!drd.IsClosed); // データリーダを閉じる。 drd.Close(); // ストアドプロシージャの戻り値パラメタの値を取得。 return (int)((DamSqlSvr)this.GetDam()).DamSqlCommand.Parameters["ret"].Value; }
現行のCmnDaoでは、
SetSqlByCommand("sp_help", CommandType.StoredProcedure);
のようにStoredProcedure?パラメタが指定できないのでストアド実行はできないと思います。
しかし、現行のCmnDaoも、以下まで対応可能済みなので、
ちょっとカスタマイズすればストアド実行できるようになると思います。
((DamSqlSvr)cmndao.GetDam()).DamSqlCommand.Parameters["ret"].Value;
対応されたモジュールをpullrequestして貰えると、とても助かります。
B層ベースクラス2の例外処理をカスタマイズして、 リトライ対象例外を業務例外に振り替え、P層に正常系の戻り値が戻るようにします。
Dim sr As New System.IO.StreamReader("C:\temp\input.txt",System.Text.Encoding.Default) Dim ts as String ts = sr.ReadToEnd() sr.Close() Dim fs As New System.IO.FileStream("C:\temp\input.gif",System.IO.FileMode.Open,System.IO.FileAccess.Read) Dim bs(fs.Length) As Byte fs.Read(bs,0,fs.Length) cmd.CommandText = "INSERT INTO TLOB(NO,TEXT,IMG) VALUES(:v1 ,:v2 ,:v3) " cmd.CommandType = CommandType.Text Dim p1 As New OracleParameter() p1.OracleDbType = OracleDbType.Decimal p1.Value = 3 cmd.Parameters.Add(p1) Dim p2 As New OracleParameter() p2.OracleDbType = OracleDbType.Clob p2.Value = ts cmd.Parameters.Add(p2) Dim p3 As New OracleParameter() p3.OracleDbType = OracleDbType.Blob p3.Value = bs cmd.Parameters.Add(p3) cmd.ExecuteNonQuery() tx.Commit()
myOracleCommand.CommandText = "SELECT id, clob_column FROM clob_content WHERE id = 1"; OracleDataReader myOracleDataReader = myOracleCommand.ExecuteReader(); myOracleDataReader.Read();
cmd.CommandText = "SELECT XXXX FROM YYYY FOR UPDATE"; reader = cmd.ExecuteReader(); reader.Read(); OracleClob clob = reader.GetOracleClob(0); clob.Append(ending.ToCharArray(), 0, ending.Length); txn.Commit();
共通のコマンド タイムアウト値をconfigファイルに設定できます。
// 配列データを作成 object[] temp1 = new string[] { "aaa", "bbb", "ccc" }; object[] temp2 = new string[] { "aaa", "bbb", "ccc" }; object[] temp3 = new string[] { "aaa", "bbb", "ccc" }; // ODP.NETの配列バインドの場合は、ArrayBindCountを指定 ((DamOraOdp)this._dam).DamOracleCommand.ArrayBindCount = temp.Length; // 配列バインド(型情報が必要) ((BaseDam)this._dam).SetParameter("P1", temp1, OracleDbType.Varchar2); ((BaseDam)this._dam).SetParameter("P2", temp2, OracleDbType.Varchar2); ((BaseDam)this._dam).SetParameter("P3", temp3, OracleDbType.Varchar2);
XML内部で使用不可能な文字列は、HTMLエンコーディングが必要になります。
これらの文字列が含まれる場合は、下記の現象が発生します。
として実行されるため、この現象は、不正なフォーマットのXMLを投げている事に起因します。
して下さい。
検索条件のIN句(副問合せ)を動的化する場合、動的パラメタライズド・クエリのIFタグ ではなく、タグのネストが可能なSUBタグを使用頂けます。
自動生成Dao
自動生成Dao
共通Dao(CmnDao)
大量データ処理(バッチ更新処理)で
性能が出ません。
従って、大量データ処理(バッチ更新処理)の場合は、
を使用して下さい。
含むXMLタグを「再帰的」に検索し、
としています。
XMLタグの検索方法が再帰的なので、
<?xml version="1.0"?> <ROOT> SELECT * FROM Shippers <WHERE> WHERE <IF>ShipperID =@P1<ELSE>IS NULL</ELSE></IF> <IF>and ShipperID =@P1<ELSE>IS NULL</ELSE></IF> </WHERE> <PARAM> P1, Int32, 1<DIV/> </PARAM> </ROOT>
↓↓↓
SELECT * FROM Shippers WHERE ShipperID =@p1 and ShipperID =@p1