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).Value
は Decimal
型になっているためです。
Field.Type のマッピングについては別途整理しようと思います。
デフォルト列値の違い
次に、表 EMP
にデフォルト値 0
を持つ列 DELETE_FLAG
を追加(alter table EMP add DELETE_FLAG NUMBER DEFAULT 0;
)して、AddNew
メソッド実行後のDELETE_FLAG
の値を見てみます。
実行結果は、oo4o、ADO とも DELETE_FLAG
の Debug.Print
の値は Null
となりますが、データベースに書き込まれた値は、oo4o は Null
、ADO は 0
となります。
ADO のこの振る舞いは、oo4o の CreateDynaset
のオプションに ORADYN_ORAMODE + ORADYN_NO_REFETCH
を指定した場合と一致します。
No comments:
Post a Comment