access操作したい

解決


ハロハロ  2004-10-08 23:45:37  No: 11336

ローカルデータベースにAccessを使って、Delphiから操作したいのですが、
アクセスコンポーネントの使い方が判りません。
参考になるサイトなどご存知の方がいましたら、教えて下さい。

行いたい事
SQLでデータの追加・更新・削除等を行う。(C/Sと同じことを行いたい)

Delphi7Pro+Access2000


NT  2004-10-09 01:27:45  No: 11337

アクセスコンポーネントを使用しないで普通にADOあるいはBDEで追加・更新・削除をしてはまずいのですか?


ハロハロ  2004-10-12 17:30:40  No: 11338

>アクセスコンポーネントを使用しないで普通にADOあるいはBDEで追加・更新・削除をしてはまずいのですか?

まずくありません。
出来れば、ADOでやりたいと思っていますが、参考になるサイトなどが見つからなくて、、
ご存知であれば教えて頂けないでしょうか?
宜しくお願いします。


シャキちゃき  URL  2004-10-12 22:19:52  No: 11339

ADOを使う参考になるもの

http://www.borland.co.jp/delphi/papers/ado/ado01.html

C:\Program Files\Borland\Delphi7\Demos\Ado

では、いかがですか?


HOta  2004-10-12 22:22:09  No: 11340

ADOコンポーネントを貼りつけて、
例えばTADOConnectuionでAccseeファイルにつないで、
TADOQueryでSQL文を流せば出来ます。


bob  2004-10-13 03:40:42  No: 11341

以前作った、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;

-----


ハロハロ  2004-10-13 17:53:13  No: 11342

シャキちゃきさん HOtaさん  bobさん
有難う御座います。

TADOQueryとDBGridで使い方が判りました。
DBGridでは細かなカスタマイズが出来そうにないようなので、
StringGridで作っていきたいと思います。

1つ気になっていることがあるのですが、ACCESSは使用していくと
ファイルサイズが肥大化していきますが、上記方法で使う時は
気にすることは無いのでしょうか?
もし最適化する必要があるのであれば、その方法を教えて頂きたく思います。


bob  2004-10-13 18:21:29  No: 11343

Accessの最適化等はそれに特化したHPや掲示板が最適化と思います。

メニューの [ツール(T)] - [データベースユーティリティ(D)...] - [最適化(C)] 
あたりではないですか?
Access使ったことないけど(ぉ


ハロハロ  2004-10-13 18:23:55  No: 11344

>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();
  }
すみませんが、宜しくお願いします


ハロハロ  2004-10-13 18:48:18  No: 11345

すみません。
コードがC++でした。。
実際にはC++で組んでますが、Delphiのほうをある程度知っていたので、
Delphiで質問させて頂きました。
すみません。

先ほどの
>ADOQuery1->FieldValues[j];のようにしたい
の件ですが、下記の様にする事で解決しました。
ADOQuery1->Fields->Fields[j]->AsString;

後から見た人もわかるように以後注意致します。
皆様有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加