C++Builder Tips


Jetデータベース・リレーションの作成(DAO/OLE経由)


"新規テーブル1"と"新規テーブル2"いうテーブルにリレーションシップを作成します。



//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <dbdaoint.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)
{
  int i;
  Variant vDAO;
  Variant vDB;
  Variant vREL;
  Variant vREL2;
  Variant vFLD[3];

  AnsiString str = ExtractFilePath(Application->ExeName) + "TEST.mdb";

  //テーブルの存在チェックを行い、存在していた場合削除します。
  if (JetRelationExists(str,"新規リレーション")){
    JetRelationDelete(str,"新規リレーション");
  }

  vDAO = Variant::CreateObject("DAO.DBEngine.35");
  vDB = vDAO.Exec(Function("OpenDatabase") << str);
  vREL = vDB.Exec(Function("CreateRelation") << "新規リレーション");

  //主テーブルの定義
  vREL.Exec(PropertySet("Table") << "新規テーブル1");
  //副テーブルの定義
  vREL.Exec(PropertySet("ForeignTable") << "新規テーブル2");
  //参照整合性の定義
  vREL.Exec(PropertySet("Attributes") << dbRelationUpdateCascade);
  //主テーブルのフィールド定義
  vFLD[0] = vREL.Exec(Function("CreateField") << "FieldText");
  vFLD[1] = vREL.Exec(Function("CreateField") << "FieldInteger");
  vFLD[2] = vREL.Exec(Function("CreateField") << "FieldLong");
  //外部テーブルのフィールドの定義
  vFLD[0].Exec(PropertySet("ForeignName") << "FieldText");
  vFLD[1].Exec(PropertySet("ForeignName") << "FieldInteger");
  vFLD[2].Exec(PropertySet("ForeignName") << "FieldLong");

  for (i=0;i<3;i++){
    vREL.Exec(Function("Fields")).Exec(Procedure("Append") << vFLD[i]);
  }

  vDB.Exec(Function("Relations")).Exec(Procedure("Append") << vREL);

  vDB.Exec(Procedure("Close"));

}
//---------------------------------------------------------------------------
bool TForm1::JetRelationExists(AnsiString strPath, AnsiString strRelationName)
{
  bool bRet = false;
  int i;
  int iMax;
  Variant vDAO;
  Variant vDB;
  AnsiString str;

  vDAO = Variant::CreateObject("DAO.DBEngine.35");
  vDB = vDAO.Exec(Function("OpenDatabase") << strPath);

  iMax = vDB.Exec(Function("Relations")).Exec(Function("Count"));
  for (i=0;i<iMax;i++){
    str = vDB.Exec(PropertyGet("Relations")<<i).Exec(PropertyGet("Name"));
    if (str == strRelationName){
      bRet = true;
      break;
    }
  }
  vDB.Exec(Procedure("Close"));
  return bRet;

}

//---------------------------------------------------------------------------

bool TForm1::JetRelationDelete(AnsiString strPath, AnsiString strRelationName)
{
  Variant vDAO;
  Variant vDB;

  vDAO = Variant::CreateObject("DAO.DBEngine.35");
  vDB = vDAO.Exec(Function("OpenDatabase") << strPath);

  vDB.Exec(Function("Relations")).Exec(Procedure("Delete") << strRelationName);
  vDB.Exec(Procedure("Close"));
  return true;

}

//---------------------------------------------------------------------------

DownLoad bcbtips050.lzh 4KB(BCB5)