SAK 図書館
VB RDO + SQL 応用編 (その一) RDO 接続 - OpenConnection
VB から、Oracle や SQL-Server などのリモートアクセスデータベースに接続す るには、RDO または ADO を使用するのが効率的です。 RDO と ADO は多少の構文の違いはあるものの似たようなコードでアクセスでき ます。コントロールとのオートメーション接続では ADO しかサポートされてい ないので選択肢はありません。 プログラミングによるアクセスでは、ADO より高速な RDO を選択した方が良い でしょう。(Excel でも RDO を使用できる。) 基本的に Oracle、SQL-Sever、MDB で共通です。 ■VB RDO (リモートデータベースオブジェクト) ODBC 接続により、SQL-RDB にアクセスします。 機能として、 ODBC 接続 (ログイン) レコードセット処理 (select) トランザクション処理 (commit、rollback) アクションクエリ実行 (insert、update、delete) ODBC 接続解除 (ログアウト) を使います。 ■VB プロジェクト設定 新規プロジェクトに、メニュー、参照設定で、 Microsoft Remote Data Object 2.0 を組み入れます。 ■ODBC システム DSN 定義
■ODBC 接続(Oracle 接続、オラクル接続、SQL-Server 接続、mdb 接続) '** RDO 変数宣言 Dim RDBen As rdoEnvironment Dim RDBcn As rdoConnection Dim RDBcn2 As rdoConnection '** ODBC 接続 Set RDBen = rdoEnvironments(0) Set RDBcn = RDBen.OpenConnection("", rdDriverNoPrompt, False, _ "dsn=SAK3;uid=SAK;pwd=SAK") '|_ I/O Set RDBcn2 = RDBen.OpenConnection("", rdDriverNoPrompt, True, _ "dsn=SAK3_ADO;uid=SAK;pwd=SAK") '|_ read only '** RDB 処理 'ここに操作コードが入る '** ODBC 接続解除 RDBcn2.Close RDBcn.Close 通常は、RDBcn だけの接続で良いのですが、データベースに Oracle を使用する 場合、Oracle 固有の ODBC ドライバと Microsoft が提供する Oracle 用の ODBC ドライバとを使用する機能により使い分ける必要があります。 上のコードでは、RDBcn が Oracle8 のネイティブドライバ、RDBcn2 が Microsoft が提供している Oracle 用ドライバです。(ODBC 定義による) リアルバッチ型のように大量のレコードセットをオープンする必要がある場合は、 RDBcn2 の SAK3_ADO を使わないとエラーが連発する。 逆に RDBcn2 で更新処理をするとエラーが発生しやすい。 これは、I/O モードの違いではなく、Oracle ドライバと MS-Oracle ドライバの 違いである。更新 SQL は、Oracle 本来のドライバでないとうまく動作しない。 少量のレコードセットの扱いには問題ないのだが、大量のレコードセットを扱お うとすると、RDO が MS 製のためか、MS-Oracle ドライバが必要となる。 (これは、ADO アクセスでも同じ。) ■補足 ・実際の VB コードでは、ODBC 接続は、フォームロードで行う。 アクセスの度に接続していてはレスポンスが悪い。 同じく、ODBC 接続解除は、フォームアンロードで行う。 更に高度にやるなら、DLL のロード時に接続して、DLL のアンロード時に 接続解除することもできる。この場合の RDBcn は複数プログラムで共有で きる DLL 設計になっていなければ意味がありません。 ・ODBC サーバと物理的に接続するには、 Set RDBcn = RDBen.EstablishConnection(prompt, readonly, options) があります。 EstablishConnection では、rdoConnection は自動的には追加されません。 ■現実的なコード例 Option Explicit '** RDO 変数宣言 Dim RDBen As rdoEnvironment Dim RDBcn As rdoConnection Dim RDBcn2 As rdoConnection '======================================================================= ' 準備 '======================================================================= Private Sub Form_Load() Dim dsn As String Dim dsn2 As String Dim rcd As Long '** アイキャッチ表示 'Load FormLogo 'FormLogo.Show 'DoEvents '// 接続に 10 秒ほどかかるので、「データベース接続中...」などの '// モードレスダイアログを表示すると良い。 '** DSN 設定 dsn = "dsn=SAK3;uid=SAK;pwd=SAK" dsn2 = "dsn=SAK3_ADO;uid=SAK;pwd=SAK" '// ODBC システム DSN を使用しての接続例である。 '** ODBC 接続 On Local Error Resume Next Set RDBen = rdoEnvironments(0) Set RDBcn = RDBen.OpenConnection("", rdDriverNoPrompt, False, dsn) rcd = Err On Local Error GoTo 0 If rcd <> 0 Then MsgBox "データベースに接続出来ません。(RDBcn)" end End If On Local Error Resume Next Set RDBcn2 = RDBen.OpenConnection("", rdDriverNoPrompt, True, dsn2) rcd = Err On Local Error GoTo 0 If rcd <> 0 Then MsgBox "データベースに接続出来ません。(RDBcn2)" end End If '** アイキャッチ終了 'Unload FormLogo '// 接続が完了すれば、「データベース接続中...」をクローズする。 End Sub '======================================================================= ' 後始末 '======================================================================= Private Sub Form_Unload(Cancel As Integer) '** ODBC 接続解除 On Local Error Resume Next RDBcn.Close RDBcn2.Close On Local Error GoTo 0 End Sub ■ソースサービス
■更に現実的なコードアドバイス ・dsn をコード中に定義するより、初期化ファイルなどを使用してプログラム と独立させる方が可搬性に富んでいる。 この場合、パスワードなどがもろ見えになってしまっては困る。 暗号化関数を作成して、隠蔽処理など必ず実施する。 SAK3 では、データベースのユーザ ID とパスワードを暗号化して初期化フ ァイルに定義している。従って、どのようなシステム環境、実行環境にもリ コンパイルなしでオブジェクトを移行できる。 ■hEnv プロパティ ・cn.hEnv は、rdoEnvironment オブジェクトに対応する ODBC 環境ハンドル を含む長整数型(Long) の値を返す。 ODBC API を実行するのに使用しますが、hEnv は、その都度最新のハンドル を取得して利用します。(hDbc、hStmt も同様) ■VB RDO + SQL 応用編資料
■VB ADO + SQL 応用編資料
■VB oo4o + SQL 応用編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料