C++BuilderでTIBExtractコンポーネントを使い、Firebirdのメタデータを取り出す。

TIBExtractコンポーネントを使うと、テーブルやビューなどのメタデータを取り出すことができます。

TIBExtractExtractObjectメソッドで取り出すメタデータを指定します。

//すべてのメタデータを取り出す
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")
);

TIBExtract5

コメント

  1. バージョンが2.5だと取得に失敗します。
    このコンポーネントは、古いFirebirdにのみ対応しているのでしょうか?

  2. C++Builder XE5とFirebird 2.5.2で確認したところ、問題なく動作しました。
    もしかしたら、対応していない機能があるのかもしれませんね。
    シンプルなテーブルで試してみたらどうなりますか?

  3. IBConsole 日本語版+α(http://ht-deko.minim.ne.jp/junkbox.html#IBCONSOLE)の更新履歴に次のような記載がありました。

    rel.37 2013/10/06
    ・データベースのメタデータを表示すると SQL エラーが出る問題を修正。
     (XE2 以前の IBExtract と同等の処理にした)

    関係がありそうな気がします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください