|
|
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 を使用したサンプルです。 以下のようにセットします。
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" ) );
Books from Amazon [an error occurred while processing this directive] |