TIBExtractコンポーネントを使うと、テーブルやビューなどのメタデータを取り出すことができます。
TIBExtractのExtractObjectメソッドで取り出すメタデータを指定します。
//すべてのメタデータを取り出す
IBExtract1->ExtractObject(eoDatabase);
//すべてのテーブルのメタデータを取り出す
IBExtract1->ExtractObject(eoTable);
//テーブル"TBL1"のメタデータを取り出す
IBExtract1->ExtractObject(eoTable, "TBL1");
テーブルのメタデータを取り出すサンプルプログラム
Firebirdでテーブルを作成します。
CREATE TABLE TBL1 (
COL1 INTEGER PRIMARY KEY,
COL2 INTEGER NOT NULL,
COL3 VARCHAR(100)
);
C++BuilderでTIBDatabase、TIBTransaction、TIBExtract、TMemo、TButtonコンポーネントを配置します。
TButtonコンポーネントのClickイベントを追加します。
//各コンポーネントのDatabaseプロパティとTransactionプロパティを設定します。
IBDatabase1->DefaultTransaction = IBTransaction1;
IBTransaction1->DefaultDatabase = IBDatabase1;
IBExtract1->Database = IBDatabase1;
IBExtract1->Transaction = IBTransaction1;
//Firebirdに接続します。
IBDatabase1->DatabaseName = FileName; //FDBファイルのパス
IBDatabase1->LoginPrompt = false;
IBDatabase1->Params->Clear();
IBDatabase1->Params->Add("user_name=sysdba"); //ユーザー名
IBDatabase1->Params->Add("password=masterkey"); //パスワード
IBDatabase1->Params->Add("lc_ctype=UNICODE_FSS"); //文字コード
IBDatabase1->Connected = true;
//メタデータを取り出し、メモコンポーネントに出力します。
IBExtract1->ExtractObject(eoTable, "TBL1");
Memo1->Lines->Text = IBExtract1->Items->Text;
//切断します。
IBDatabase1->Close();
実行したところ
テーブルをコピーするサンプルプログラム
取り出したメタデータを編集して、同じフィールドを持つ別名のテーブルを作成します。
※Firebird-jp-generalメーリングリストの「Re: テーブルのコピーについて」の投稿を参考にしました。
Firebirdでテーブルを作成します。
CREATE TABLE "TBL1" (
COL1 INTEGER PRIMARY KEY,
COL2 INTEGER NOT NULL,
COL3 VARCHAR(100)
);
C++BuilderでTIBDatabase、TIBTransaction、TIBExtract、TIBSQL、TMemo、TButtonコンポーネントを配置します。
TButtonコンポーネントのClickイベントを追加します。
//各コンポーネントのDatabaseプロパティとTransactionプロパティを設定します。
IBDatabase1->DefaultTransaction = IBTransaction1;
IBTransaction1->DefaultDatabase = IBDatabase1;
IBExtract1->Database = IBDatabase1;
IBExtract1->Transaction = IBTransaction1;
IBSQL1->Database = IBDatabase1;
IBSQL1->Transaction = IBTransaction1;
//Firebirdに接続します。
IBDatabase1->DatabaseName = FileName; //FDBファイルのパス
IBDatabase1->LoginPrompt = false;
IBDatabase1->Params->Clear();
IBDatabase1->Params->Add("user_name=sysdba"); //ユーザー名
IBDatabase1->Params->Add("password=masterkey"); //パスワード
IBDatabase1->Params->Add("lc_ctype=UNICODE_FSS"); //文字コード
IBDatabase1->Connected = true;
//トランザクションを開始します
IBTransaction1->StartTransaction();
UnicodeString OldTable = "TBL1"; //コピー元のテーブル名
UnicodeString NewTable = "TBL2"; //新しいテーブル名
//コピー元のテーブルのメタデータを取得します
IBExtract1->ExtractObject(eoTable, OldTable);
//新しいテーブルを作成するSQLを組み立てます
IBSQL1->SQL->Text = StringReplace(
IBExtract1->Items->Text, "\"" + OldTable + "\"", "\"" + NewTable + "\"",
TReplaceFlags() << rfReplaceAll << rfIgnoreCase);
//SQLを実行します
IBSQL1->ExecQuery();
//コミットします
IBTransaction1->Commit();
//作成したテーブルのメタデータを確認します
IBExtract1->ExtractObject(eoTable, NewTable);
Memo1->Lines->Text = IBExtract1->Items->Text;
//切断します。
IBDatabase1->Close();
実行したところ
取得したデータ型について(2013年4月19日追記)
テーブルを作成したときのSQLと、取得したメタデータを比較してみます。
テーブルを作成するSQL
CREATE TABLE TBL
(
A INTEGER NOT NULL primary key,
B VARCHAR(100),
C CHAR(20),
D TIME,
E TIMESTAMP,
F DATE,
G SMALLINT,
H FLOAT,
I DOUBLE PRECISION,
J NUMERIC(5, 2),
L DECIMAL(6, 3),
M BLOB
);
取得したメータデータ
CREATE TABLE "TBL"
(
"A" INTEGER NOT NULL,
"B" VARCHAR(100),
"C" CHAR(20),
"D" TIME,
"E" TIMESTAMP,
"F" DATE,
"G" SMALLINT,
"H" FLOAT,
"I" DOUBLE PRECISION,
"J" NUMERIC(5, 2),
"L" DECIMAL(6, 3),
"M" BLOB SUB_TYPE 0 SEGMENT SIZE 80,
PRIMARY KEY ("A")
);
バージョンが2.5だと取得に失敗します。
このコンポーネントは、古いFirebirdにのみ対応しているのでしょうか?
C++Builder XE5とFirebird 2.5.2で確認したところ、問題なく動作しました。
もしかしたら、対応していない機能があるのかもしれませんね。
シンプルなテーブルで試してみたらどうなりますか?
IBConsole 日本語版+α(http://ht-deko.minim.ne.jp/junkbox.html#IBCONSOLE)の更新履歴に次のような記載がありました。
rel.37 2013/10/06
・データベースのメタデータを表示すると SQL エラーが出る問題を修正。
(XE2 以前の IBExtract と同等の処理にした)
関係がありそうな気がします。