ローカルデータベースにAccessを使って、Delphiから操作したいのですが、
アクセスコンポーネントの使い方が判りません。
参考になるサイトなどご存知の方がいましたら、教えて下さい。
行いたい事
SQLでデータの追加・更新・削除等を行う。(C/Sと同じことを行いたい)
Delphi7Pro+Access2000
アクセスコンポーネントを使用しないで普通にADOあるいはBDEで追加・更新・削除をしてはまずいのですか?
>アクセスコンポーネントを使用しないで普通にADOあるいはBDEで追加・更新・削除をしてはまずいのですか?
まずくありません。
出来れば、ADOでやりたいと思っていますが、参考になるサイトなどが見つからなくて、、
ご存知であれば教えて頂けないでしょうか?
宜しくお願いします。
ADOを使う参考になるもの
http://www.borland.co.jp/delphi/papers/ado/ado01.html
C:\Program Files\Borland\Delphi7\Demos\Ado
では、いかがですか?
ADOコンポーネントを貼りつけて、
例えばTADOConnectuionでAccseeファイルにつないで、
TADOQueryでSQL文を流せば出来ます。
以前作った、ADO接続のクラスです。
SQL Server用なので、AccessのProviderに直してください。
#例外処理を大幅にわざと削ってあります。
テストフォームは
TEdit x 4
TMemo x 2
TDBGrid x 1
TButton x 4
割り当てはソース参照(ぉ
-----
unit Unit2;
interface
uses SysUtils, ADODB;
type
TDB = class
private
{ Private 宣言 }
FProvider: STring;
FConn: TADOConnection;
FQuery: TADOQuery;
//Provider生成用
FDBServer: String;
FDBName: String;
FUserName: String;
FPassword: String;
function GetStates: TObjectStates;
public
{ Public 宣言 }
property Provider: String read FProvider;
property States: TObjectStates read GetStates;
constructor Create();
destructor Destroy; override;
procedure BeginTrans;
procedure RollbackTrans;
procedure CommitTrans;
procedure Execute(SQL: String);
function Select(SQL: String): TADOQuery;
function Connect: Boolean;
procedure Close;
//Provider生成用
property DBServer: String read FDBServer write FDBServer;
property DBName: String read FDBName write FDBName;
property UserName: String read FUserName write FUserName;
property Password: String read FPassword write FPassword;
end;
implementation
{ TDB }
constructor TDB.Create();
begin
//宣言
FConn := TADOConnection.Create(nil);
FQuery := TADOQuery.Create(nil);
end;
function TDB.Connect: Boolean;
begin
//初期値
result := False;
//FProvider
FProvider := Format('Provider=SQLOLEDB.1; Persist Security Info=True; ' +
'Data Source=%s; Initial Catalog=%s;' +
'User ID=%s; Password=%s',
[FDBServer, FDBName, FUserName, FPassword]);
FConn.ConnectionString := FProvider;
//DB接続
try
self.Close;
FConn.LoginPrompt := False;
FConn.Open();//Option.UserName, Option.Password);
FQuery.Connection := FConn;
result := true;
except
on E:Exception do raise;
end;
end;
destructor TDB.Destroy;
begin
FQuery.Close;
FQuery.Free;
Self.Close;
FConn.Free;
inherited Destroy;
end;
procedure TDB.BeginTrans;
begin
FConn.BeginTrans;
end;
procedure TDB.CommitTrans;
begin
FConn.CommitTrans;
end;
procedure TDB.Execute(SQL: String);
begin
FConn.Execute(SQL);
end;
procedure TDB.RollbackTrans;
begin
FConn.RollbackTrans;
end;
function TDB.GetStates: TObjectStates;
begin
result := FConn.State;
end;
function TDB.Select(SQL: String): TADOQuery;
begin
if FQuery.Active then
FQuery.Active := False;
FQuery.SQL.Text := SQL;
FQuery.Active := True;
result := FQuery;
end;
procedure TDB.Close;
begin
if FConn.State = [stOpen] then
FConn.Close;
end;
end.
---テスト
procedure TForm1.FormCreate(Sender: TObject);
begin
FDB := TDB.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FDB.Free;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
FDB.DBServer := Edit1.Text;
FDB.DBName := Edit2.Text;
FDB.UserName := Edit3.Text;
FDB.Password := Edit4.Text;
if FDB.Connect then
ShowMessage('接続');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
tmpQuery: TADOQuery;
tmpDataSource: TDataSource;
begin
tmpQuery := FDB.Select(Memo1.Text);
tmpDataSource := TDataSource.Create(self);
tmpDataSource.DataSet := tmpQuery;
DBGrid1.DataSource := tmpDataSource;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
FDB.Close;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FDB.Execute(Memo2.Text);
end;
-----
シャキちゃきさん HOtaさん bobさん
有難う御座います。
TADOQueryとDBGridで使い方が判りました。
DBGridでは細かなカスタマイズが出来そうにないようなので、
StringGridで作っていきたいと思います。
1つ気になっていることがあるのですが、ACCESSは使用していくと
ファイルサイズが肥大化していきますが、上記方法で使う時は
気にすることは無いのでしょうか?
もし最適化する必要があるのであれば、その方法を教えて頂きたく思います。
Accessの最適化等はそれに特化したHPや掲示板が最適化と思います。
メニューの [ツール(T)] - [データベースユーティリティ(D)...] - [最適化(C)]
あたりではないですか?
Access使ったことないけど(ぉ
>1つ気になっていることがあるのですが、ACCESSは使用していくと
>ファイルサイズが肥大化していきますが、上記方法で使う時は
>気にすることは無いのでしょうか?
この件ですが、簡単なサンプルを作って試したところ(selectのみ)
肥大化しませんでした。
失礼しました。。
別の質問なのですが、フィールドの値を取得するときに
ADOQuery1->FieldValues["Field2"]としているのですが、
ADOQuery1->FieldValues[j]のようにするにはどうするのでしょうか?
for( int i=0; i<ADOQuery1->RecordCount-1; i++ )
{
for( int j=0; j <ADOQuery1->FieldCount-1; j++)
{
StringGrid1->Cells[0][i+1] = ADOQuery1->FieldValues["Field1"];
StringGrid1->Cells[1][i+1] = ADOQuery1->FieldValues["Field2"];
//この部分をStringGrid1->Cells[j][i+1] = ADOQuery1->FieldValues[j];のようにしたい
}
ADOQuery1->Next();
}
すみませんが、宜しくお願いします
すみません。
コードがC++でした。。
実際にはC++で組んでますが、Delphiのほうをある程度知っていたので、
Delphiで質問させて頂きました。
すみません。
先ほどの
>ADOQuery1->FieldValues[j];のようにしたい
の件ですが、下記の様にする事で解決しました。
ADOQuery1->Fields->Fields[j]->AsString;
後から見た人もわかるように以後注意致します。
皆様有難う御座いました。
ツイート | ![]() |