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 へ戻る