Create  Edit  Diff  Phillro Industries  Index  Search  Changes  History  Source  RSS  Note  wikifarm  Login

RDB::SQLConnection

RDB::SQLConnection クラス

dbExpress を使ってデータベースにアクセスするためのコネクションクラス


アクセスしたいデータベースを指定する方法には二通りの方法があります。

(A)dbxconnections.ini で指定する方法

(B)自前で指定する方法。


(A)dbxconnections.ini で指定する方法

#!ruby -Ks
require "phi"
require "rdb"

DB = RDB::SQLConnection.new("APOLLO","apollo","apollo")
DB.extend RDB::InterBase
DB.open

SQLConnection.new の第一引数「APOLLO」は dbxconnections.ini で指定した接続名。2番目の「apollo」はユーザ名、3番目の「apollo」はパスワードです。

C:/Program Files/Common Files/Borland Shared/DBExpress/dbxconnections.ini に次のようなセクションを追加しておく。

[APOLLO]
Database=iBook-01:/Library/Frameworks/Firebird.framework/Resources/examples/employee.fdb
User_Name=sysdba
Password=masterkey
BlobSize=-1
CommitRetain=False
DriverName=Interbase
ErrorResourceFile=
LocaleCode=0000
RoleName=RoleName
ServerCharSet=
SQLDialect=1
Interbase TransIsolation=ReadCommited
WaitOnLocks=True

(B)自前で指定する方法。

上記の dbxconnections.ini とドライバ情報が書かれている dbxdrivers.ini の内容を SQLConnection#params? でセットすれば自前で指定できます。それぞれのファイルの所在は下記の通り。

C:/Program Files/Common Files/Borland Shared/DBExpress/dbxconnections.ini

C:/Program Files/Common Files/Borland Shared/DBExpress/dbxdrivers.ini

具体的な方法については InterBase の説明のページに例があります。

指定方法の違いによる特徴

複数の端末からアクセスする場合で、データベースの所在などに変更が生じたとき、

(A)の方法だと、管理者が各端末を回って設定を変更して回る必要が出てきます。

(B)の方法だと、プログラムを変更するだけですみます。実行日時をみて予定時刻以降のアクセスは一括して接続先を変更するというような芸当も可能になります。


require "phi"
require "methods_for_wiki"
require "rdb/dbx"
puts RDB::SQLConnection.methods_for_wiki

_dump => Phi::Component#_dump

active_statements

after_connect

after_connect=

データベースに接続した直後に呼ばれるイベントハンドラ。

after_disconnect

after_disconnect=

データベースへの接続を解除した直後に呼ばれるイベントハンドラ。

auto_clone

auto_clone=

auto_clone?

before_connect

before_connect=

データベースへの接続の直前に呼ばれるイベントハンドラ。

before_disconnect

before_disconnect=

データベースへの接続を解除する直前に呼ばれるイベントハンドラ。

clone_connection

close

close_data_sets

当該コネクションに属するデータセットをすべて閉じる。

* アプリの別の部分で使っている場合でも、閉じてしまう。その部分で、オープンを確認せずに使っているような場合にはエラーになるので注意。

close_datasets

commit

トランザクションの中で実際にデータベースに書き込む。 正常に書き込めない場合には例外を生成する。

transaction{}の途中でも可能。

component_count => Phi::Component#component_count

components => Phi::Component#components

connected

connected=

connected?

connection_name

connection_name=

connection_name プロパティは,接続設定の名前を指定します。

connection_name プロパティを設定すると,名前付き接続設定を使うことができます。connection_name プロパティを設定すると,dbxconnections.ini ファイルにその名前で格納されているドライバおよび接続パラメータを反映するよう,driver_name プロパティおよび params プロパティが自動的に設定されます。

つまり、connection_name に設定する名前は dbxconnections.ini ファイルに記述されたセクション名ということになります。

このページの先頭にある「(A)dbxconnections.ini で指定する方法」を参照してください。

設定ファイル(dbxconnections.ini)とは異なった接続をしたい場合にも、いったんは設定ファイルから読込んで、それを変更するのが良いようです。

connection_state

connection_state=

data_sets

driver_name

driver_name=

driver_name プロパティは,SQL 接続に関連付けられたデータベースドライバの名前を指定します。

dbxdrivers.ini ファイルのセクション名(インストールされている dbExpress ドライバの名前、INTERBASE、MYSQL、ORACLE、DB2 など)に設定します。 インストールされているドライバは dbxdrivers.ini ファイルに示されており,それらの名前は GetDriverNames? 関数を使って取り出すことができます。

名前付き接続の場合の場合には、dbxconnections.ini ファイルでの設定に従って自動的にセットされるので不要です。 名前付き接続というのは connection_name プロパティに dbxconnections.ini ファイルのセクション名を指定し、その名前で格納されているドライバおよび接続パラメータをそのまま使う場合のことです。

実際に、dbxdrivers.ini ファイルを見てみると、次のように書かれていました。(セクションごとの最初の3行だけ掲げます。実際のファイルも見てください)。

C:/Program Files/Common Files/Borland Shared/DBExpress/dbxdrivers.ini

[DB2]
GetDriverFunc=getSQLDriverDB2
LibraryName=DBEXPDB2.DLL
VendorLib=db2cli.dll
[Interbase]
GetDriverFunc=getSQLDriverINTERBASE
LibraryName=dbexpint.dll
VendorLib=GDS32.DLL
[MYSQL]
GetDriverFunc=getSQLDriverMYSQL
LibraryName=dbexpmys.dll
VendorLib=LIBMYSQL.dll
[Oracle]
GetDriverFunc=getSQLDriverORACLE
LibraryName=dbexpora.dll
VendorLib=OCI.DLL

event_handle

execute

execute_direct

execute_ex

extend => Phi::Persistent#extend

get_driver_func

get_driver_func=

dbxdrivers.ini ファイルの各セクションの「GetDriverFunc」項目の値を書きます。InterBaseであれば「GetDriverFunc=getSQLDriverINTERBASE」の行の右辺の "getSQLDriverINTERBASE" という名前になります。

get_field_names

get_procedure_names

in_transaction

in_transaction?

トランザクションの途中であるかどうかを返す。

index_names(table_name)

指定したテーブルに付加されたインデックスの一覧を返す。

internal_query => RDB::Connection_ex#internal_query

internal_table => RDB::Connection_ex#internal_table

keep_connection

keep_connection=

keep_connection?

library_name

library_name=

dbxdrivers.ini ファイルの各セクションの「LibraryName」項目の値を書きます。MySQL であれば「LibraryName=dbexpmys.dll」の行の右辺の "dbexpmys.dll" という名前になります。

load_params_from_ini_file

load_params_from_ini_file メソッドは,driver_name プロパティおよび params プロパティを,connection_name プロパティに関連付けられた値に設定します。

このメソッドでとりあえずデフォルトを読み込んでおいてから、自前で書き換えるのが便利かも。

名前付き接続をそのまま使う場合には、このメソッドを使う必要はありません。

load_params_on_connect

load_params_on_connect=

load_params_on_connect?

load_params_on_connect プロパティは,SQLConnection コンポーネントがサーバーに接続する直前に connection_name プロパティで指定されている設定をロードするかどうかを指定します。

アプリケーションで load_params_from_ini_file メソッドを呼び出して,代替の接続ファイルを指定する場合は,load_params_on_connect プロパティを true に設定しないでください。load_params_on_connect プロパティが true の場合,接続が開くとすぐに dbxconnections.ini ファイルから接続設定がロードされ,load_params_from_ini_file メソッドによってロードされた値がオーバーライドされます。

locale_code

locale_code=

login_prompt

login_prompt=

login_prompt?

login_prompt が true だとデータベース接続のためのパスワード入力ダイアログがでます。

login_prompt が false だとパスワード入力ダイアログを出さずに、あらかじめセットしたユーザ名とパスワードで接続します。

ユーザ名やパスワードの設定は params で行います。params["User_Name"]、params["Password"]でセットすればよいようです。

C:/Program Files/Common Files/Borland Shared/DBExpress/dbxdrivers.ini

[DB2]
Password=password
User_Name=user
[Interbase]
Password=masterkey
User_Name=sysdba
[MYSQL]
Password=password
User_Name=user
[Oracle]
Password=password
User_Name=user

lookup => RDB::Connection_ex#lookup

max_stmts_per_conn

name

name=

new_query

new_table

on_login

on_login=

open

params

params=

接続先に関するパラメータを参照・設定する。パラメータは使用するデータベースによって異なる。

params_loaded

params_loaded=

params_loaded?

prop_info => Phi::Component#prop_info

query

rec_count => RDB::Connection_ex#rec_count

rec_exist? => RDB::Connection_ex#rec_exist?

rollback

トランザクションを中止して、書き込まれなかったことにする。

transaction{}の途中でも可能。

select => RDB::Connection_ex#select

set_trace_callback_event

sql_hour_glass

sql_hour_glass=

sql_hour_glass?

sql_hour_glass プロパティは,時間のかかる処理中にカーソルを CR_SQL_WAIT に変更するかどうかを指定します。

sql_hour_glass プロパティを true に設定すると,時間がかかる可能性のある処理が接続で実行中であることをカーソルで示すことができます。時間のかかる処理には以下のようなものがあります。

  • データベースサーバーへの接続の確立
  • データベースサーバーからのメタデータのフェッチ
  • Execute メソッドを使った文の実行

sql_hour_glass プロパティが false の場合は,SQL 接続でこのような処理が行われてもカーソルは変更されません。

デフォルトは true のようです。

start_transaction

トランザクションを開始する。

トランザクションの終わりは、commit(OK)かrollback(NG)。

Apollo では transaction{}を使った方が安全確実。

table

table_create => RDB::Connection_ex#table_create

table_drop => RDB::Connection_ex#table_drop

table_exist?

table_names ( system_tables=false )

テーブル名が入ったPhi::StringListオブジェクトを返す。

* 戻り値を to_a すると扱いやすくなる。

* Delphi での名前は GetTableNames。Ruby 流に Get を削除した table_names になっているが、alias で get_table_names があってもよいかもしれない。

* Delphi での引数は procedure GetTableNames?(List: TStrings; SystemTables?: Boolean = False); Delphi ではあらかじめ TStringList? のオブジェクトを作っておいて、そこに結果を取得する必要があるが、Apollo では配列を戻り値として返す。

table_recreate => RDB::Connection_ex#table_recreate

table_scope

table_scope=

table_scope プロパティを設定すると,get_table_names メソッドによって示されるテーブルの種類を指定できます。

また schema_type パラメータが ST_TABLES である set_schema_info メソッドを呼び出した後に SQL データセットに入れられるテーブルの種類を指定できます。

table_scope プロパティを使うと,テーブルの種類の組み合わせに関する情報を要求できます。

デフォルトでは table_scope プロパティは通常のテーブルとビュー(TS_TABLE と TS_VIEW)のみを要求します。

次の表に,table_scope プロパティに指定できる値を示します。

  • 値 意味
  • TS_SYMONYM 同義語
  • TS_SYS_TABLE システムテーブル
  • TS_TABLE 通常のテーブル
  • TS_VIEW ビュー

注意 table_scope プロパティは,get_table_names メソッドの system_tables パラメータが false の場合のみ get_table_names メソッドに影響します。また,set_schema_info メソッドの schema_type パラメータが ST_TABLES の場合のみ set_schema_ifo メソッドに影響します。

* ということは、出番ナシだな。View と Table を区別したいときには役に立つか?

transaction{} => RDB::Connection_ex#transaction

ブロック内でトランザクションを実行する。

transactions_supported

transactions_supported?

vendor_lib

vendor_lib=

dbxdrivers.ini ファイルの各セクションの「VendorLib」項目の値を書きます。Oracle であれば「VendorLib=OCI.DLL」の行の右辺の "OCI.DLL" という名前になります。

write_res_file => Phi::Component#write_res_file

Last modified:2011/08/21 09:39:48
Keyword(s):
References:[InterBase] [RDB::DataSetProvider] [dbxconnections.ini] [ext-rdb-RDB-constants] [ext-rdb-index] [コネクションクラス]