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