请问,不用数据控件,在一个窗体中怎样避免重复连接数据库,例如:
unit login;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ADODB, Grids, DBGrids, DB, ComCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    ComboBox1: TComboBox;
    Button2: TButton;
    ListView1: TListView;
    ComboBox2: TComboBox;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit2: TEdit;
    Button3: TButton;
    Button4: TButton;
    ComboBox3: TComboBox;
    Label4: TLabel;
    ComboBox4: TComboBox;
    ComboBox5: TComboBox;
    Edit3: TEdit;
    Edit4: TEdit;
    ComboBox6: TComboBox;
    Edit5: TEdit;
    ComboBox7: TComboBox;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  ExeRoot: String;
  DataFile: String;
  
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  ADOQuery1: TADOQuery;
  i: Integer;
  path:string;
begin
    path:=extractfilepath(application.ExeName)+'data\db.mdb'; ////////////////第1次连接
    ADOQuery1:=TADOQuery.Create(self);
    ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+path+';Persist Security Info=False;';
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select * from users ');
    ADOQuery1.Open;
    //ADOQuery1.Active:=True;
    listbox1.Clear;//清空列表框内容
    for i:=1 to ADOQuery1.RecordCount do
    begin
      listbox1.Items.Add(ADOQuery1.FieldByName('name').Asstring);
      ADOQuery1.next;
    end;
    ADOQuery1.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
  ADOQuery1: TADOQuery;
  i: Integer;
  path:string;
begin
    path:=extractfilepath(application.ExeName)+'data\db.mdb';////////////////第2次连接
    ADOQuery1:=TADOQuery.Create(self);
    ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+path+';Persist Security Info=False;';
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select * from users ');
    ADOQuery1.Open;
    //ADOQuery1.Active:=True;
    for i:=1 to ADOQuery1.RecordCount do  //向列表框插入内容
    begin
      listbox2.Items.Add(ADOQuery1.FieldByName('name').Asstring);
      ADOQuery1.next;
    end;
    ADOQuery1.first; //指针指到记录集第一个
    for i:=1 to ADOQuery1.RecordCount do  //向下拉框1插入内容
    begin
      ComboBox1.Items.Add(ADOQuery1.FieldByName('name').Asstring);
      ADOQuery1.next;
    end;
    ADOQuery1.Free;
      ComboBox2.Items.Add('男');   //向下拉框2插入内容
      ComboBox2.Items.Add('女');
      ComboBox3.Items.Add('化验'); //向下拉框3插入内容
      ComboBox3.Items.Add('检验');
      ComboBox4.Items.Add('男'); //向下拉框4插入内容
      ComboBox4.Items.Add('女');
      ComboBox5.Items.Add('化验'); //向下拉框5插入内容
      ComboBox5.Items.Add('检验');
end;procedure TForm1.Button2Click(Sender: TObject); //查寻
var
  ADOQuery2: TADOQuery;
  path:string;
  Item: TListItem;
  i: Integer;
  str:string;
begin
    path:=extractfilepath(application.ExeName)+'data\db.mdb';////////////////第3次连接
    ADOQuery2:=TADOQuery.Create(self);
    ADOQuery2.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+path+';Persist Security Info=False;';
    ADOQuery2.SQL.Clear;
    str:='select * from users where 1=1';
    if ComboBox1.Text<>'' then str:=str+' and name=''' + ComboBox1.Text+'''';
    if ComboBox2.Text<>'' then str:=str+' and sex=''' + ComboBox2.Text+'''';
    if Edit1.Text<>'' then  str:=str+' and age='''+Edit1.Text+'''';
    if ComboBox3.Text<>'' then str:=str+' and gw=''' + ComboBox3.Text+'''';
    messagedlg(str,mterror,[mbok],1);
    ADOQuery2.SQL.Add(str);
    ADOQuery2.Open;
    messagedlg('姓名<'+ADOQuery2.FieldByName('name').Asstring+'>ID<'+ADOQuery2.FieldByName('id').Asstring+'>性别<'+ADOQuery2.FieldByName('sex').Asstring+'>',mterror,[mbok],1);
    listview1.Items.Clear;
    ADOQuery2.first; //指针指到记录集第一个
       for i:=0 to ADOQuery2.RecordCount-1  do
         begin
            item:=listview1.Items.Add;
            item.Caption:=ADOQuery2.Fields[0].value ;
            item.SubItems.Add(ADOQuery2.Fields[1].value);
            item.SubItems.Add(ADOQuery2.Fields[2].value);
            item.SubItems.Add(ADOQuery2.Fields[3].value);
            item.SubItems.Add(ADOQuery2.Fields[4].value);
            ADOQuery2.Next;
         end;
    ADOQuery2.Free;
    ComboBox1.Text:='';
    ComboBox2.Text:='';
    Edit1.Text:='';
    ComboBox3.Text:='';
end;
   
procedure TForm1.Button3Click(Sender: TObject);  //添加
  var
  ADOQuery3: TADOQuery;
  path:string;
  i:Integer;
  begin
    path:=extractfilepath(application.ExeName)+'data\db.mdb';////////////////第4次连接
    ADOQuery3:=TADOQuery.Create(self);
    ADOQuery3.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+path+';Persist Security Info=False;';
    ADOQuery3.SQL.Clear;
    ADOQuery3.SQL.Add('insert into users(name,sex,age,gw)values(:xm,:xb,:nl,:gw)');
    ADOQuery3.parameters.ParamByName('xm').Value :=trim(Edit2.text);
    ADOQuery3.parameters.ParamByName('xb').Value :=trim(ComboBox4.Text);
    ADOQuery3.parameters.ParamByName('nl').Value :=trim(edit3.text);
    ADOQuery3.parameters.ParamByName('gw').Value :=trim(ComboBox5.Text);
    ADOQuery3.execsql;
    showmessage('成功添加新用户!');    ADOQuery3.SQL.Clear;
    ADOQuery3.SQL.Add('select * from users ');
    ADOQuery3.Open;
    for i:=1 to ADOQuery3.RecordCount do  //向列表框插入内容
    begin
      listbox2.Items.Add(ADOQuery3.FieldByName('name').Asstring);
      ADOQuery3.next;
    end;
    ADOQuery3.first; //指针指到记录集第一个
    for i:=1 to ADOQuery3.RecordCount do  //向下拉框1插入内容
    begin
      ComboBox1.Items.Add(ADOQuery3.FieldByName('name').Asstring);
      ADOQuery3.next;
    end;
    ADOQuery3.Free;
  end;procedure TForm1.Button5Click(Sender: TObject);
  var
    ADOQuery3: TADOQuery;
    path:string;
    i:Integer;
  begin
    path:=extractfilepath(application.ExeName)+'data\db.mdb';////////////////第5次连接
    ADOQuery3:=TADOQuery.Create(self);
    ADOQuery3.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+path+';Persist Security Info=False;';
    ADOQuery3.SQL.Clear;
    ADOQuery3.SQL.Add('select * from users');
    ADOQuery3.Open;
    for i:=1 to ADOQuery3.RecordCount do  //向列表框插入内容
    begin
      listbox2.Items.Add(ADOQuery3.FieldByName('name').Asstring);
      ADOQuery3.next;
    end;
    ADOQuery3.first; //指针指到记录集第一个
    ADOQuery3.SQL.Clear;
    ADOQuery3.SQL.Add('delete from users where id=:recid');
    ADOQuery3.parameters.ParamByName('recid').Value:=listbox2.Items.Values;
    ADOQuery3.execsql;
    //showmessage('成功删除新用户!');
    messagedlg('id:<'+listbox2.Items.Text+'>',mterror,[mbok],1);
    ADOQuery3.Free;
  end;end.

解决方案 »

  1.   

    两层结构的话共用一个Connection组件,保持连接就可以了
      

  2.   

    1、拖一个ADOConnection组件,通过它来连接数据库,具体就是设置其ConnectionString属性,Open方法连接2、ADOQuery组件也不必每次查询都创建一个,在一个窗体中如果没有特别要求,也可以共用一个,并把其Connection属性设为ADOConnection,不需要逐个设置ADOQuery的ConnectionString属性,否则这样的代码以后维护很麻烦
      

  3.   

    建立一个datamodule,上面放一个ADOConnection,用来连接数据库,其他各个单元引用datamodule单元,所有的数据连接datamodale上面的ADOConnection
      

  4.   

    bdmh已经很详细了。use unit
      

  5.   

    不行的话,
    QQ:56280213
    注明,delphi。