トランザクション制御とその他のプロパティ
TOracleSessionのトランザクション制御とその他のプロパティについて説明します。
トランザクション制御 -Commit/Rollback/SavePoint
TOracleSession
はセッションを開いた時点で暗黙のうちにトランザクションを開始します。よって、明示的にStart Transaction / Begin Transaction としてトランザクションを開始する必要はありません。開始したトランザクションは、CommitまたはRollbackによって終了し、一つのトランザクションが終了すると同時に、新しいトランザクションが始まります。
DOAを用いてプログラミングをしている場合、トランザクションの終了は以下の場合に起こります。
- TOracleSession のCommit/Rollbackメソッドを明示的に呼び出したとき。
- TOracleSession の CommitUpdatesメソッドまたは ApplyUpdatesメソッドで、CachedUpdatesモードで変更していたTOracleDataSetの更新を明示的に反映させたとき。(ApplyUpdateの場合は引数でコミットの有無を選択できます)
- TOracleSessionのRollbackOnOnDisconnectプロパティがFalse(デフォルト値)にセットされている状態で、LogOffメソッドまたはConnected:=Falseによって)データベース接続が解除した際。(暗黙のコミット)
- TOracleDataSetオブジェクトのCommitOnPostプロパティがTrueにセットされているとき(デフォルト = True)、データセットのレコードを更新して明示的あるいは暗黙にPostメソッドが呼び出されたとき(暗黙のコミット)。ただし、CachedUpdatesモードでは暗黙のコミットは行われません。
- TOracleQuery/TOracleDataSet/TOracleScriptのいずれかで、DDL(Create Table/Alter Table/Drop Tableなど)が実行されたとき。DDLの実行はOracleに暗黙のコミットを発生させます。
特に注意が必要と思われるのは3番・4番での暗黙のコミットです。デフォルトでパレットから置いたTOracleDataSetは、CommitOnPost=Trueとなっているので、不用意に暗黙のコミットを発生させぬようCachedUpdatesモードを使うことを強くおすすめします。また、セッションをクローズする直前には明示的にCommit/Rollbackを記述するのが丁寧です。
以下に、TOracleSessionでトランザクション制御関連のメソッドをまとめます。
- TOracleSession
- procedure Commit;
- procedure Rollback;
- procedure SavePoint(const Name: string);
- procedure RollbackToSavePoint(const Name: string);
- property IsolationLevel: procedure SetTransaction:
IsolationLevel, SetTransactionは、ともにトランザクションの独立性?レベル(Isolation level)を変更します。デフォルトではOracleサーバの設定に従います。
その他のプロパティ
Oracleのデータ型と、Delphiのデータ型、BDEのフィールド型は、必ずしも一対一できれいに対応しません。そのため、Oracleのクエリーで取得したカラムをDelphiの変数に読み出したり、データベース対応コントロールに結びつけたりする際には、暗黙の型変換を避けて通ることができません。BDEでは数値型の精度落ちの問題など、何かと問題が絶えない部分ですが、DOAはOracle+Delphiでの使用に特化しているために、この暗黙の型変換の方法をプログラマが適切にパラメータを設定して調整できます。
- TOracleSession
- property BytesPerCharacter: 2バイト文字を含むマルチバイト文字列を扱う場合には bc2BytesかbcAutoDetectにセットする必要があります。
- デフォルトでは1バイトのため、CLOBのサイズ取得の際に文字数=バイト数という誤った仮定をしてしまい、文字列の後ろが切れます。
- また、*ORA-01026: multiple buffers of size greater than 2000 in the bind list の原因にもなります。
- property Preferences: DOAの動作全体をコントロールするパラメータ群です。一度ヘルプに目を通してください。
- FloatPrecision : Oracleの小数・実数型フィールドの有効桁数がこれ以上の場合には、文字型フィールドとなります。DelphiのDouble型の精度は15桁ですが、デフォルトでは、無条件にDouble型にバインドします。
- IntegerPrecision: Oracleの整数型フィールドの桁数が9桁までは、DelphiのInteger型にバインドし、それを越えるとDouble型に、さらに桁が大きくなると文字列型にバインドするのがデフォルトです。そのしきい値を設定できます。
- SmallIntPrecision: デフォルトでは、Oracleの整数型フィールドをSmallintにバインドすることはありません。
- MaxStringFiledSize : BDEでは、255バイトを越える文字列型項目をTMemoFieldで表します。DOAではデフォルトではすべての文字列型項目をTStringFieldとして扱うため、TDBRichEditを使う場合などMaxStringFieldSizeを255にセットすることでBDE互換とすることがあります。
- TrimStringFields : デフォルトでは、文字列項目を取得する際、末尾の空白文字を取り除きます。
- ZeroDateIsNull : 日付型のフィールドに TDateTime(0) = 1899/12/31をセットした場合、フィールドにNULL値をセットするのがデフォルトです。
- NullLOBIsEmpty : CLOB, BLOB フィールドにNULL値が与えられたとき、NULL値の代わりにEmpty CLOB/BLOBをセットするようにもできます。
- property BytesPerCharacter: 2バイト文字を含むマルチバイト文字列を扱う場合には bc2BytesかbcAutoDetectにセットする必要があります。