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