読者です 読者をやめる 読者になる 読者になる

Unified InterbaseをC++Builder XEで試してみた。

C++Builder Tips ライブラリ・コンポーネント

かねてから、Pro版で使用可能なFirebird/Interbase用のコンポーネントを探していて、

という記事がポストされていたので、Unified InterbaseC++Builder XEで試してみた。

インストールは、C++Builder XEではC++Builder 2009用のプロジェクトファイル"UIBBCB12Win32.groupproj"を開いてC++Builder XE用に変換。あるいは、UIBD15Win32.groupprojを開いて、プロジェクトオプションの[C/C++ 出力ファイルの生成]を"すべての C++ Builder ファイル(パッケージ ライブラリを含む)を生成"にすればOK。

ただし、ビルド時にuiblib.pasから生成されるuiblib.hppで以下のエラーが発生してコンパイルエラーになる。

[BCC32 エラー] uiblib.hpp(284): E2019 'TUIBSQLVar:: :: :: ()' は無名の共用体内では宣言できない
[BCC32 エラー] uiblib.hpp(298): E2019 'TUIBSQLVar:: :: ()' は無名の共用体内では宣言できない

このエラーを回避するには、パッケージのビルド時に生成される$(BDSCOMMONDIR)\hpp\uiblib.hppを編集して、TUIBSQLVar内部の無名構造体にダミーな適当な構造体名をつけてやればOK。

struct DECLSPEC_DRECORD TUIBSQLVar
{
  
public:
  short SqlType;
  short SqlScale;
  short SqlSubType;
  short SqlLen;
  char *SqlData;
  short *SqlInd;
  #pragma pack(push,1)
  union
  {
    struct __0 // ←ダミーの構造体名を追加
    {
      TUIBParamsFlags Flags;
      unsigned:8;
      System::Word ID;
      short MaxSqlLen;
      short ParamNameLength;
      System::StaticArray<char, 125> ParamName;

    };
    struct __1 // ←こっちもダミーを追加
    {
      short SqlNameLength;
      System::StaticArray<char, 32> SqlName;
      short RelNameLength;
      System::StaticArray<char, 32> RelName;
      short OwnNameLength;
      System::StaticArray<char, 32> OwnName;
      short AliasNameLength;
      System::StaticArray<char, 32> AliasName;
      
    };
    
  };
  #pragma pack(pop)
};

C++Builder用のサンプルコードである、examples\UIB\BCB6\Query\Query.bprをビルドして、Firebird 2.1のサンプルにある"EMPLOYEE.FDB"を読ませてみたところ無事動作。何となく使えそうだけど、TUIBDataSetが読み込み専用っぽいのが残念。この辺がうまくいけばDBコンポーネントと連携させられるんだけどね…。*1

*1:Firebirdと連携させたいのならば、素直にEnt版を買うのがベストなんだろうけど。