C++BuilderでMsAcess

今回インプライズのC++Builder4でマイクロソフトのアクセス97の データベースを操作したので、ちょっとまとめてみます。
C++Builderは1.0発売時にごそごそと扱ってはいたのですが、今回 ビュジュアル・ベーシックで作成する予定のだったアプリケーションを C++Builder4で作成する事になり、その時得た情報などをまとめて みました。
前準備(BDEの設定)BDEの設定はただ単にドライバーの変更だけでも十分ですが、 環境設定もしておくと何かと便利な面もありますので、とりあえず設定しておきます。
BDE設定はBDE Administratorというツールがありますので起動し ます。
「環境設定」-&;「Drivers」->「Native」->「MSACCESS」を選択します。
定義エリアのDLL32にIDDA3532.DLL(MSACCESS97用ドライバー) の設定がなされているか確認します。

IDDA32.DLLであればMSACCESS95用のドライバーなので、 IDDA3532.DLLドライバーに変更して下さい。
今度は「データベース」の設定に戻り、新規作成をするとデータベースドライバ名を 聞いてきますので、先程設定した「MSACCESS」を選択します。 適当なエリアス名を設定します。
ここでは、MS-TESTにしました。
ここで定義の DATABASE NAME を設定します。C:\TEST.MDB にしました。
MsAccessとTable
TTable->TDataSource->TBGrid を使用したサンプルです。
以下のようにセットします。
| class | プロパティ | 設定内容 |
| TTable | Name | Table1 |
| TableName | TEST | |
| DatabaseName | MS-TEST | |
| TTDataSource | Name | DS1 |
| DataSet | Table1 | |
| TDBGrid | Name | DBG1 |
| DataSource | DS1 | |
| TColumn | DBG1->Column | cd |
| 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 へ戻る