2017-11-26

oo4oからADOへの変換 (5) Find 系メソッド

oo4o と ADO では Move 系メソッドは大きな違いはありませんが、Find 系メソッドは大きく異なります。
サンプルコードはOracle® Objects for OLE開発者ガイドの FindFirst、FindLast、FindNextおよびFindPreviousメソッド の例を書き換えたものです。

ADO

Sub Form_Load()
' Dim OraSession As OraSession
' Dim OraDatabase As OraDatabase
Dim cnn As ADODB.Connection
' Dim OraDynaset As OraDynaset
Dim rst As ADODB.Recordset
' Dim OraFields As OraFields
Dim flds As ADODB.Fields
Dim FindClause As String
' Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set cnn = CreateObject("ADODB.Connection")
' Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "SCOTT/TIGER", 0&)
cnn.Open "Provider=OraOLEDB.Oracle;Data Source=ExampleDb;User ID=scott;Password=tiger"
' Set OraDynaset = OraDatabase.CreateDynaset("select * from emp where empno >= 7654 and empno <= 7844 ", ORADYN_NO_BLANKSTRIP)
Set rst = CreateObject("ADODB.Recordset")
rst.CursorLocation = adUseClient
rst.Open "select * from emp where empno >= 7654 and empno <= 7844 ", cnn, adOpenStatic, adLockOptimistic, adCommandText
' Set OraFields = OraDynaset.Fields
Set flds = rst.Fields
' OraDynaset.MoveFirst
rst.MoveFirst
'FindClause for job as MANAGER
' FindClause = "job LIKE '%GER'" 
  FindClause = "job LIKE '*GER*'"
' OraDynaset.FindFirst FindClause
rst.Find FindClause
'NoMatch property set to true , if no rows found
' If OraDynaset.NoMatch Then
If rst.EOF Then
MsgBox "Couldn't find rows "
Else
' MsgBox OraFields("ename").Value ' Should display BLAKE
MsgBox flds("ename").Value
' OraDynaset.FindNext FindClause
rst.Find FindClause, 1, adSearchForward
' MsgBox OraFields("ename").Value ' Should display CLARK
MsgBox flds("ename").Value
' OraDynaset.FindPrevious FindClause
rst.Find FindClause, 1, adSearchBackward
' MsgBox OraFields("ename").Value ' Should display BLAKE
MsgBox flds("ename").Value
End If
End Sub
  • 本筋ではありませんが、oo4o の CreateDynaset はデフォルトで(ORADYN_NO_BLANKSTRIP を指定しないと)、右側のスペースを削除しますが、ADO のRecordsetでは削除されません。(RTRIM が必要)
  • oo4o の OraDynaset には FindFirstFindLastFindNextFindPrevious の4つのメソッドがありますが、ADO のRecordset では Findメソッドのみでオプションを利用します。
  • ADO Recordset には NOMATCH プロパティがありませんので、EOF (または BOF)プロパティで判定します。
  • ADO では検索文字列のワイルドカード % の代わりに * を使います。また、後方一致検索 LIKE '*GER' は使用できませんので LIKE '*GER*' (中間一致)にする必要があります。
  • IS 演算子も使用できません。IS NULL , IS NOT NULL の代わりに = NULL , <> NULL を使用する必要があります。

No comments:

Post a Comment