今回はトランザクションと行セット更新の例です。
サンプルコードは、Oracle® Objects for OLE開発者ガイドのBeginTransメソッド の例を書き換えたものです。
ADO
Sub Form_Load() 'Declare variables ' Dim OraSession As OraSession ' Dim OraDatabase As OraDatabase Dim cnn As ADODB.Connection ' Dim OraDynaset As OraDynaset Dim rst As ADODB.Recordset ' Dim fld As OraField Dim fld As ADODB.Field 'Create the OraSession Object. ' Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set cnn = CreateObject("ADODB.Connection") 'Create the OraDatabase Object by opening a connection to Oracle. ' Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&) cnn.Open "Provider=OraOLEDB.Oracle;Data Source=ExampleDb;User ID=scott;Password=tiger" Dim cmd As New ADODB.Command cmd.ActiveConnection = cnn cmd.CommandType = adCmdText cmd.CommandText = "select * from emp" 'Create the OraDynaset Object. ' Set OraDynaset = OraDatabase.CreateDynaset("select * from emp", 0&) Set rst = CreateObject("ADODB.Recordset") rst.CursorLocation = adUseClient rst.Open cmd, , adOpenStatic, adLockOptimistic 'Start Transaction processing. ' OraSession.BeginTrans cnn.BeginTrans 'Setup a field object to save object references. ' Set fld = OraDynaset.Fields("sal") Set fld = rst.Fields("sal") 'Traverse until EOF is reached, setting each employees salary to zero ' Do Until OraDynaset.EOF = True Do Until rst.EOF = True ' OraDynaset.Edit ' fld.Value = 0 ' OraDynaset.Update ' OraDynaset.MoveNext fld.Value = 0 rst.Update rst.MoveNext ' Loop Loop MsgBox "All salaries set to ZERO." 'Currently, the changes have NOT been committed to the database. 'End Transaction processing. Using RollbackTrans 'means the rollback can be canceled in the Validate event. ' OraSession.Rollback cnn.RollbackTrans 'MsgBox "Salary changes rolled back." End Sub
- パラメータにも対応できるように、あえて
Command
オブジェクトを使用しています。 - ADO では、編集開始の
Edit
メソッドが不要です。また、Update
メソッドがなくてもMoveNext
で更新されます。 - oo4o の
Rollback
は、ADOではRollbackTrans
にメソッド名が変わります。BeginTrans
,CommitTrans
はメソッド名も同じです。 - ADO には、
ResetTrans
メソッドはないため、
On Error Resume Next cn.RollbackTnans On Error Goto 0
で代用することになります。
UpdateBatch メソッド(ADO)
ADO の場合、
rst.Open cmd, , adOpenStatic, adLockBatchOptimistic Do Until rst.EOF = True fld.Value = 0 rs.MoveNext Loop rst.UpdateBatch
Update
をループの外に出し、UpdateBatch
メソッドにすることにより、まとめて変更処理を行い、ラウンドトリップを削減できます。
MSDAORA で UpdateBatch
メソッドを使う場合、Recordset の LockType に adLockBatchOptimistic
を指定しなければ、
現在の Recordset は更新をサポートしていません。プロバイダーか、選択されたロックタイプの限界の可能性があります。
とのエラーが発生します。(OraOLEDB ではなぜか出ません。)
Execute メソッドによる更新可能行セットの取得(OraOLEDB)
OraOLEDBの場合、Command.Executeで更新可能な行セットを取得できます。
Set rst = CreateObject("ADODB.Recordset") rst.Open cmd, , adOpenStatic, adLockOptimistic
の箇所は
cmd.Properties("IRowsetChange") = True cmd.Properties("Updatability") = 7 Set rst = cmd.Execute
に書き換え可能です。
但し、AddNew
メソッドを実行すると、
ORA-01400: (“SCOTT”.”EMP”.”EMPNO”)にはNULLは挿入できません。
が発生しました。
No comments:
Post a Comment