oo4o 接続
OO4O(Oracle Objects for OLE)はWindows用アプリケーション向けにOracleが提供しているデータベース接続ミドルウエアで、DAOに類似したインターフェースを利用します。
    11gR2 を最後に 12c 以降は提供されなくなりました。
oo4o データベース(Oracle)への接続
【oo4o 接続】
    <参照設定>
    Dim OraSession As New OraSessionClass
    Dim OraDatabase As OraDatabase
Set OraDatabase = OraSession.OpenDatabase(NetServiceName, User&Pass, Options)
    <CreateObject関数>
    Dim OraSession As Object
    Dim OraDatabase As Object
    Set OraSession = CreateObject(“OracleInProcServer.XOraSession“)
    Set OraDatabase = OraSession.OpenDatabase(NetServiceName, User&Pass, Options)
引数・戻り値
- OraSession ・・・ セッション
- OraDatabase ・・・ データベース
- NetServiceName ・・・ ネットサービス名を指定します。
- User&Pass  ・・・  データベースへ接続するユーザー名とパスワードを指定します。
 (※書式は、[ユーザー名]/[パスワード])
- Options ・・・ データベースのオプション・モードの設定に使用するビット・フラグ文字を指定します。options = 0 の場合は、デフォルトのモード設定が適用されます。
参照設定する場合、VBE の「ツール」-「参照設定」をクリックし「参照設定ダイアログボックス」を開き、「Oracle InProc Server 5.0 Type Library」にチェックを入れます。
Options に指定できる値(定数)の一覧表
| 定数 | 値 | 内容 | 
| ORADB_DEFAULT | &H0& | Visual Basicモード(デフォルト) | 
| ORADB_ORAMODE | &H1& | Oracleモード | 
| ORADB_NOWAIT | &H2& | ロック非待機モード | 
| ORADB_NO_REFETCH | &H4& | Oracleモード(再フェッチなし) | 
| ORADB_NONBLK | &H8& | 非ブロックモード | 
| ORADB_ENLIST_IN_MTS | &H10& | MTSモードでのリスト | 
| ORADB_ENLIST_FOR_ CALLLBACK | &H20& | コールバック・モードでのリスト | 
Oracle 接続(oo4o)
サンプルVBAソース1
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | Sub Sample_oo4o_oracle1()     '参照設定「Oracle InProc Server 5.0 Type Library」     Const NETSERVICENAME = "hpdb1"          'tnsnames.ora ファイルのネットサービス名'     Const USERPASS = "uhpdb1/uhpdb1"        'ユーザー名/パスワード     Dim OraSession As New OraSessionClass   'セッション     Dim OraDatabase As OraDatabase          'データベース     Dim OraDynaset As OraDynaset            'レコードセット     Dim row As Long     Dim col As Long     Dim strSQL As String     'SQL文     strSQL = "select * from table01 order by id"     'OraDatabaseオブジェクトの生成     Set OraDatabase = OraSession.OpenDatabase(NETSERVICENAME, USERPASS, ORADB_DEFAULT)     Set OraDynaset = OraDatabase.CreateDynaset(strSQL, ORADYN_DEFAULT)     With Worksheets("oracle_oo4o")         .Cells.Clear         'フィールド名         For col = 0 To OraDynaset.Fields.Count - 1             .Cells(1, col + 1) = OraDynaset(col).Name         Next col         'レコード         Do Until OraDynaset.EOF             For col = 0 To OraDynaset.Fields.Count - 1                 .Cells(row + 2, col + 1) = OraDynaset(col).Value             Next col             row = row + 1             OraDynaset.MoveNext         Loop     End With     OraDynaset.Close     Set OraDynaset = Nothing     Set OraDatabase = Nothing     Set OraSession = Nothing End Sub | 
実行結果
サンプルVBAソース2
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | 'CreateObject関数 Const ORADB_DEFAULT = &H0& Const ORADB_ORAMODE = &H1& Const ORADB_NOWAIT = &H2& Const ORADB_NO_REFETCH = &H4& Const ORADB_NONBLK = &H8& Const ORADB_ENLIST_IN_MTS = &H10& Const ORADB_ENLIST_FOR_CALLLBACK = &H20& Const ORADYN_DEFAULT = &H0& Const ORADYN_NO_AUTOBIND = &H1& Const ORADYN_NO_BLANKSTRIP = &H2& Const ORADYN_READONLY = &H4& Const ORADYN_NOCACHE = &H8& Const ORADYN_ORAMODE = &H10& Const ORADYN_NO_REFETCH = &H20& Const ORADYN_N_MOVEFIRST = &H40& Const ORADYN_DIRTY_WRITE = &H80& Sub Sample_oo4o_Oracle2()     Dim OraSession As Object        'セッション     Dim OraDatabase As Object       'データベース     Dim OraRs As Object             'レコードセット     Dim strSQL As String     Dim col As Long     Dim row As Long     Set OraSession = CreateObject("OracleInProcServer.XOraSession")     Set OraDatabase = OraSession.OpenDatabase("hpdb1", "uhpdb1/uhpdb1", ORADB_DEFAULT)     strSQL = "insert all into table01 values (4, '西田直美') "     strSQL = strSQL & "into table01 values (5, '東田一行') "     strSQL = strSQL & "into table01 values (6, '加藤れな') "     strSQL = strSQL & "into table01 values (7, '大野吾郎') "     strSQL = strSQL & "select * from dual"     'エラートラップ開始     On Local Error GoTo ErrHandler     'エラーをリセット     OraDatabase.LastServerErrReset     'トランザクション処理開始     OraSession.BeginTrans     'SQL文実行     OraDatabase.Executesql strSQL     'トランザクション終了     OraSession.CommitTrans     On Local Error GoTo 0 ErrHandler:     If Err <> 0 Then         MsgBox "【エラー番号:" & Err & "】" & vbCrLf & _                 Error & vbCrLf & "更新をキャンセルしました"         'トランザクションキャンセル         OraSession.Rollback     End If     '表示     Set OraRs = OraDatabase.CreateDynaset("select * from table01", ORADYN_DEFAULT)     With Worksheets("oracle_oo4o")         .Cells.Clear         For col = 0 To OraRs.Fields.Count - 1             .Cells(1, col + 1) = OraRs(col).Name         Next         row = 0         Do Until OraRs.EOF             For col = 0 To OraRs.Fields.Count - 1                 .Cells(row + 2, col + 1) = OraRs(col).Value             Next             OraRs.MoveNext             row = row + 1         Loop     End With     OraRs.Close     Set OraRs = Nothing     Set OraDatabase = Nothing     Set OraSession = Nothing End Sub |