2017-11-19

oo4oからADOへの変換 (4) AddNewメソッドとデフォルト列値

Edit メソッドに引続き AddNew メソッドです。文法的には大きな違いはないものの細かな部分で違いがあります。

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
'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"
'Create the OraDynaset Object.
' Set OraDynaset = OraDatabase.CreateDynaset("select * from emp", 0&)
Dim cmd As New ADODB.Command
cmd.ActiveConnection = cnn
cmd.CommandText = "select * from emp"
Set rst = CreateObject("ADODB.Recordset")
rst.CursorLocation = adUseClient
rst.Open cmd, , adOpenStatic, adLockOptimistic
'Begin an AddNew.
' OraDynaset.AddNew
rst.AddNew
'Set the field(column) values.
' OraDynaset.Fields("EMPNO").Value = "1000"
' OraDynaset.Fields("ENAME").Value = "WILSON"
' OraDynaset.Fields("JOB").Value = "SALESMAN"
' OraDynaset.Fields("MGR").Value = "7698"
' OraDynaset.Fields("HIREDATE").Value = "19-SEP-92"
' OraDynaset.Fields("SAL").Value = 2000
' OraDynaset.Fields("COMM").Value = 500
' OraDynaset.Fields("DEPTNO").Value = 30
rst.Fields("EMPNO").Value = "1000"
rst.Fields("ENAME").Value = "WILSON"
rst.Fields("JOB").Value = "SALESMAN"
rst.Fields("MGR").Value = "7698"
rst.Fields("HIREDATE").Value = "19-SEP-92"
rst.Fields("SAL").Value = 2000
rst.Fields("COMM").Value = 500
rst.Fields("DEPTNO").Value = 30
'End the AddNew and Update the dynaset.
' OraDynaset.Update
rst.Update
' OraDynaset.Bookmark = OraDynaset.LastModified
' Debug.Print OraDynaset.Fields("EMPNO").Value
Debug.Print Cstr(rst.Fields("EMPNO").Value)
MsgBox "Added one new employee."
End Sub

文法的には oo4o と ADO は大きな違いはありませんが、oo4o は AddNew メソッドを実行してもレコードの現在位置が変わりませんが、ADO では新しく追加されたレコードが現在位置になります。oo4o の OraDynaset.Bookmark = OraDynaset.LastModified に相当するコードが ADO にはありません。

もう一つの違いは、ADO の方は、Debug.Print の出力時にStringへの型変換 (CStr) を行っていることです。CStr がなければ ␣1000 (先頭にスペースが入ります)となります。これはoo4oは OraDynaset.Fields(index).Value のデータ型が String (本来は Integer にマッピングされるはず)であるのに対して、ADOの Recordset.Fields(index).ValueDecimal 型になっているためです。

Field.Type のマッピングについては別途整理しようと思います。

デフォルト列値の違い

次に、表 EMP にデフォルト値 0 を持つ列 DELETE_FLAG を追加(alter table EMP add DELETE_FLAG NUMBER DEFAULT 0; )して、AddNew メソッド実行後のDELETE_FLAG の値を見てみます。

実行結果は、oo4o、ADO とも DELETE_FLAGDebug.Print の値は Null となりますが、データベースに書き込まれた値は、oo4o は Null、ADO は 0 となります。
ADO のこの振る舞いは、oo4o の CreateDynaset のオプションに ORADYN_ORAMODE + ORADYN_NO_REFETCH を指定した場合と一致します。

No comments:

Post a Comment