C++Builder Tips


Jetデータベース・インデックスの作成(DAO/OLE経由)


Jetデータベース・テーブルの作成(DAO/OLE経由)で作成した"新規テーブル"というテーブルに"Primarykey"という名前の主キーを作成するサンプルです。



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

#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::Button3Click(TObject *Sender)
{
  Variant vDAO;
  Variant vDB;
  Variant vTDF;
  Variant vIDX;
  Variant vIDX2; //?????
  Variant vFLD[2];

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

  //インデックスの存在チェックを行い、存在していた場合削除します。
  if (JetTableIndexExists(str,"新規テーブル","PrimaryKey")){
    JetTableIndexDelete(str,"新規テーブル","PrimaryKey");
  }

  vDAO = Variant::CreateObject("DAO.DBEngine.35");
  vDB = vDAO.Exec(Function("OpenDatabase") << str);
  vTDF = vDB.Exec(PropertyGet("TableDefs") << "新規テーブル");
  vIDX = vTDF.Exec(Function("CreateIndex") << "PrimaryKey");

  vFLD[0] = vIDX.Exec(Function("CreateField") << "FieldText");
  vFLD[1] = vIDX.Exec(Function("CreateField") << "FieldInteger");
  vFLD[2] = vIDX.Exec(Function("CreateField") << "FieldLong");

  vIDX.Exec(PropertySet("Primary") << true); //プライマリキーの設定
  vIDX.Exec(PropertySet("Unique") << true); //ユニークキーの設定

  vIDX.Exec(Function("Fields")).Exec(Procedure("Append") << vFLD[0]);
  vIDX.Exec(Function("Fields")).Exec(Procedure("Append") << vFLD[1]);
  vIDX.Exec(Function("Fields")).Exec(Procedure("Append") << vFLD[2]);

  vTDF.Exec(Function("Indexes")).Exec(Procedure("Append") << vIDX);
  vDB.Exec(Procedure("Close"));

}
//---------------------------------------------------------------------------

bool TForm1::JetTableIndexExists(AnsiString strPath, AnsiString strTableName, AnsiString strIndexName)
{
  bool bRet = false;
  int i;
  int iMax;
  Variant vDAO;
  Variant vDB;
  Variant vTDF;
  AnsiString str;

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

  vTDF = vDB.Exec(PropertyGet("TableDefs") << strTableName);
  iMax = vTDF.Exec(Function("Indexes")).Exec(Function("Count"));

  for (i=0;i<iMax;i++){
    str = vTDF.Exec(PropertyGet("Indexes")<<i).Exec(PropertyGet("Name"));
    if (str == strIndexName){
      bRet = true;
      break;
    }
  }
  vDB.Exec(Procedure("Close"));
  return bRet;
}

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

bool TForm1::JetTableIndexDelete(AnsiString strPath, AnsiString strTableName, AnsiString strIndexName)
{
  Variant vDAO;
  Variant vDB;
  Variant vTDF;

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

  vTDF = vDB.Exec(PropertyGet("TableDefs") << strTableName);
  vTDF.Exec(Function("Indexes")).Exec(Procedure("Delete") << strIndexName);

  vDB.Exec(Procedure("Close"));
  return true;
}
//---------------------------------------------------------------------------

DownLoad bcbtips048.lzh 4KB(BCB5)