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