C++BuilderでMsAcess


BED Administrator 1

 今回インプライズのC++Builder4でマイクロソフトのアクセス97の データベースを操作したので、ちょっとまとめてみます。
 C++Builderは1.0発売時にごそごそと扱ってはいたのですが、今回 ビュジュアル・ベーシックで作成する予定のだったアプリケーションを C++Builder4で作成する事になり、その時得た情報などをまとめて みました。

BED Administrator 1 前準備(BDEの設定)
 BDEの設定はただ単にドライバーの変更だけでも十分ですが、 環境設定もしておくと何かと便利な面もありますので、とりあえず設定しておきます。

BDE設定はBDE Administratorというツールがありますので起動し ます。
 「環境設定」-&;「Drivers」->「Native」->「MSACCESS」を選択します。
 定義エリアのDLL32にIDDA3532.DLL(MSACCESS97用ドライバー) の設定がなされているか確認します。
BED Administrator 1

 IDDA32.DLLであればMSACCESS95用のドライバーなので、 IDDA3532.DLLドライバーに変更して下さい。

 今度は「データベース」の設定に戻り、新規作成をするとデータベースドライバ名を 聞いてきますので、先程設定した「MSACCESS」を選択します。 適当なエリアス名を設定します。
ここでは、MS-TESTにしました。
 ここで定義の DATABASE NAME を設定します。C:\TEST.MDB にしました。

MsAccessとTable
Table を使用
 TTable->TDataSource->TBGrid を使用したサンプルです。
以下のようにセットします。

classプロパティ設定内容
TTableName Table1
    TableNameTEST
    DatabaseNameMS-TEST
TTDataSourceNameDS1
    DataSetTable1
TDBGridNameDBG1
    DataSourceDS1
TColumnDBG1->Columncd
nm

Tcolumn の DBG1->Column で表示フィールドを TEST.MDB の テーブル TEST の フィールド名を設定します。
ここでは、コード、及び名前ということでそれぞれ、cd、nmを設定しました。
上記プロパティを設定したあと、TTable プロパティ Active を True にすると テーブルとデータベースが接続され、他の設定が問題なければ DBGrid 上に ACCESSのデータベース情報が表示されます。
 また、これだけでアプリケーションとしての基本的なメンテナンスを行うことが できます。
 ただし、処理終了時にさわった、データをDBに反映するため、フォームクローズ時 に
  if(Table1->Modified ) Table1->Refresh();

を実行する必要があります。


MsAccessとの接続(TDataBase)

 テーブルのDataBaseNameに直接エリエスを設定した場合は、アプリ起動時に ユーザー名、パスワードを問い合わせてきます。
 これがいやな場合は TDataBase を利用することにより、スルーする事が可能です。
 ここで DB1は TDataBase->name です。


DB1->DatabaseName="TEST";

DB1->DriverName="MSACCESS"; // ドライバー名
DB1->Params->Clear();
DB1->Params->Add("DATABASE NAME=C:\\TEST.MDB"); // アクセスDB名
DB1->Params->Add("USER NAME=");
DB1->Params->Add("OPEN MODE=READ/WRITE");
DB1->Params->Add("LANGDRIVER=");
DB1->Params->Add("SYSTEM DATABASE=");
DB1->Params->Add("PASSWORD=");

DB1->LoginPrompt=false; //ログイン方法を制御
DB1->Connected=true;


 ここで設定した、DB1を各テーブル、クエリーに設定する事により、ユーザー名、 パスワードを未入力で処理可能です。

Table1->DatabaseName=DB1->DatabaseName;

 ここで Table1 が Table , TQurey になる。


MsAccessとTQurey

 最初は、Table->DataSource->DBGridで簡単に処理しようと 試みたのですが、この構成で行うと、フィールド数が少ない場合は速度的に問題ないよう ですが、フィールド数が200以上になった場合データのオープン読みこみだけで20秒 程かかってしまい、使用に耐えません。
 そこで、TQureyのSQLでフィールド指定を行うことにより、読み込み速度の 向上が見られたので、TQureyに変更しました。
そしてまた、TQurey->DataSource->DBGrid で処理しよう としたのですが、データの変更が DBGrid ではうまく行かないようなので、 StringGridに変更しました。
 DBgridなど、処理が簡単に出来る分だけ、規制があるようで、なかなか難しい ものです。
TQurey(rQy,wQy)->プログラム->StringGrid の構成になります。

TQureyの読み込みSQLの初期値は以下のように指定しました。

Select cd,nm from TEST where cd='01';

この cd='01' の部分を変更してデータを選択します。
実際の読み込み時のコーディングは以下のようになります。
 ここで cd->Text はTEdit で入力された値、rQy1 はTQureyです。
  rQy1->Close();
  rQy1->SQL->Clear();
  sSql = "Select cd,nm from TEST where cd='"+ cd->Text + "';";
  rQy1->SQL->Add(sSql);
  rQy1->Open();
  if(rQy1->Eof) {
    Application->MessageBox("該当データがありません。", "確認",
        MB_OK + MB_DEFBUTTON1);
    return false;
  }

 また、StringGrid(iSG)に設定するルーチンは以下の通りです。

    iSG->Cells[n][0]=rQy1->FieldValues["cd"];
    iSG->Cells[n][1]=rQy1->FieldValues["nm"];

上記とは関係無いですが、フィールドの数が多くてフィールド名を一々 設定したく無い場合以下の方法が可能です。
    for(i=0;i<12;i++) {  // たまたまフィールド数が12として
      iSG-->Cells[n][i]=rQy1-->Fields-->Fields[i]-->AsString;;
    }

また、書き込み時は以下のように記述します。
ここで、SQLは INSERT または、UPDATE になります。

    wQy1->Close();
    wQy1->SQL->Clear();
    wQy1->SQL->Add(SQL);
    wQy1->ExecSQL();

MsAccessとOLE

MS-AccessをOLE接続にて読み込むには以下の通りになります。
下記コードは読み込みデータを単にフォームに設定したリストボックス(LB1)に 追加書き込みをしているだけです。
アクセスDBへの書き込みについては、調査していません。
EDIT , POST, リダイレクションを使用する?
   AnsiString s;

   Variant theDAO = Variant::CreateObject("DAO.DBEngine.35");
   Variant theDB = theDAO.Exec( Function("OpenDatabase") << "C:\\TEST.MDB");
   Variant rdSets = theDB.Exec( Function("OpenRecordset") << "TEST");

   while( !rdSets.Exec(Function("EOF")) ) {
     s = AnsiString(rdSets.Exec(Function("cd"))) + "  "
        + AnsiString(rdSets.Exec(Function("nm")));
     LB1->Items->Add( s );
     rdSets.Exec(Function("MoveNext"));
   }
   rdSets.Exec( Procedure( "Close" ) );
   theDB.Exec( Procedure( "Close" ) );
ウインドウズ



[コンピュータ メニュー]
Top へ戻る

[温泉]
[キャンプ]
[水汲み場]
[ハムスター]
[あっちこっち]
[地元]
[遊びのページ]

[コンピュータ メニュー]