请教如何实现accesss 多表 查询

时间:2021-01-24 18:26:23
请教如何实现accesss 多表 查询
请教如何实现accesss 多表 查询

我有30个结构都一样的表(见上图),然后我想通过输入一条记录的一个字段(比如说serviceID)然后遍历整个数据库 找到这个记录的所有字段的值,并显示出来,如下图
请教如何实现accesss 多表 查询

我现在所有表的名称已经获取到了,但是如何进行多表查询啊,我现在用循环的方法好像不行,不知道哪里搞错了。
下面是我的代码,由于我不是专业搞软件的。搞起来好折腾,求大神指点迷津



interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ADODB, DB, Grids, DBGrids, StdCtrls;

type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOQuery1: TADOQuery;
    ADOConnection1: TADOConnection;
    Edit1: TEdit;
    BtnSeach: TButton;
    mmoServiceActionCN: TMemo;
    mmoDeventName: TMemo;
    DeventName: TLabel;
    ServiceActionCN: TLabel;
    mmoSYMEnglish: TMemo;
    SYMEnglish: TLabel;
    mmoLED: TMemo;
    LED: TLabel;
    cbb_DataName: TComboBox;
    procedure FormActivate(Sender: TObject);
    procedure BtnSeachClick(Sender: TObject);
    procedure mmoSYMEnglishClick(Sender: TObject);
    procedure GetDataBaseAllTable();
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  tempclass:string;//用于储存临时的数据实现组合查找
  tempsex:string;
  //获取所有表
  GetDataBaseAllTableobjTables: TStringList;
  TableCount:Integer;//表计数
implementation

{$R *.dfm}

procedure TForm1.BtnSeachClick(Sender: TObject);
var
 a:boolean;
 TableName:string;
 IDName:string;
  index:Integer;
  count:Integer;
begin
a:=form1.Edit1.Text<>'';
 index:=0;

  if a then
  begin


    while index<TableCount-1 do
    begin
    form1.ADOQuery1.Close;
    form1.ADOQuery1.SQL.Clear;
     cbb_DataName.ItemIndex:=index;
     IDName:=Edit1.Text;//输入serviceID

     TableName:='select * from '+ cbb_DataName.Items[index];
     form1.ADOQuery1.SQL.Add(TableName+'where ServiceID like '+'"%'+IDName+'%"');  //找到这条记录 然后跳出循环查询?
      form1.ADOQuery1.Open;
     index:=index+1;


    end;


   mmoServiceActionCN.Text:=form1.ADOQuery1.FieldByName('ServiceActionCN').AsString;
    mmoDeventName.Text:=form1.ADOQuery1.FieldByName('DeventName').AsString;
    mmoSYMEnglish.Text:=form1.ADOQuery1.FieldByName('SYMEnglish').AsString;
    mmoLED.Text:=form1.ADOQuery1.FieldByName('状态灯').AsString;
    form1.Caption:='事件来源:'+form1.ADOQuery1.FieldByName('来源').AsString;


  end;

end;

procedure TForm1.FormActivate(Sender: TObject);
var


 field:string;
begin
//combox1中保存的是字段列表

form1.ADOConnection1.Close;
form1.ADOQuery1.Close;
form1.ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source='+getcurrentdir+'\data\UIH_MR_Event_Log.mdb;Persist Security Info=True';
form1.ADOConnection1.LoginPrompt:=false;
form1.ADOQuery1.SQL.Clear;
 getDataBaseAllTable();
 field:='select * from '+cbb_DataName.Text;
 BtnSeach.Caption:= cbb_DataName.Text;
//form1.ADOQuery1.SQL.Add('select * from cbb');
 form1.ADOQuery1.SQL.Add(field);

form1.ADOQuery1.Open;
form1.ADOConnection1.Open;

tempclass:='0';
tempsex:='0';

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.mmoSYMEnglishClick(Sender: TObject);
begin
//更改中英文显示

end;
procedure TForm1.GetDataBaseAllTable();

begin
  GetDataBaseAllTableobjTables := TStringList.Create;
  try
ADOConnection1.GetTableNames(GetDataBaseAllTableobjTables);
cbb_DataName.Items.AddStrings(GetDataBaseAllTableobjTables);
 TableCount:=GetDataBaseAllTableobjTables.Count;   //获得表总数
//ShowMessage('总共有几个表:'+ IntToStr(GetDataBaseAllTableobjTables.Count));
  finally
    FreeAndNil(GetDataBaseAllTableobjTables);
  end;
 cbb_DataName.ItemIndex:=0;
end;

end.

5 个解决方案

#1


while index<TableCount-1 do
    begin
    form1.ADOQuery1.Close;
    form1.ADOQuery1.SQL.Clear;
     cbb_DataName.ItemIndex:=index;
     IDName:=Edit1.Text;//输入serviceID
 
     TableName:='select * from '+ cbb_DataName.Items[index];
     form1.ADOQuery1.SQL.Add(TableName+'where ServiceID like '+'"%'+IDName+'%"');  //找到这条记录 然后跳出循环查询?
      form1.ADOQuery1.Open;
     index:=index+1;
    end;

你这是想干啥额?

在一个循环里面仅仅是读取下数据库?  这么做没意义的, 相当于你直接查询你cbb_DataName 列表里面的最后一个数据表。

可以写成
     TableName:='select * from %s where ServiceID like ''%s'' '); 
      IDName := '%'  + IDName + '%';
     TableName := Format(TableName, [cbb_DataName.Items[index], IDName ];
      form1.ADOQuery1.SQL.clear();
      form1.ADOQuery1.SQL.Add(TableName);

#2


1、建立使用内存表TDataSet,保存数据这样每读取一个表,将数读入TDataSet
2、通过这循环SQL语句,ADO读取数据即可。

#3


30个结构相同的表本身就不太合适吧,建议你改一改数据库的结构。

#4


   ServiceID:=form1.edtQuery.Text;
     index:=0;
     a:=form1.edtQuery.Text<>'';
     for index :=  TableCount-1 downto 0  do
     begin
      cbb_DataName.ItemIndex:=index;
      SQL_Str := 'select * from '+ cbb_DataName.Items[index]+'  where ServiceID like '+'"%'+ServiceID+'%"';
      form1.ADOQuery1.SQL.clear();
     // form1.Caption:=SQL_Str;
      form1.ADOQuery1.SQL.Add(SQL_Str);
      form1.ADOQuery1.Open;
     if ServiceID = form1.ADOQuery1.FieldByName('ServiceID').AsString then break;
     // Rzprogressbar1.PartsComplete := 30-index;
      end;

#5


谢谢诸位,已经解决

#1


while index<TableCount-1 do
    begin
    form1.ADOQuery1.Close;
    form1.ADOQuery1.SQL.Clear;
     cbb_DataName.ItemIndex:=index;
     IDName:=Edit1.Text;//输入serviceID
 
     TableName:='select * from '+ cbb_DataName.Items[index];
     form1.ADOQuery1.SQL.Add(TableName+'where ServiceID like '+'"%'+IDName+'%"');  //找到这条记录 然后跳出循环查询?
      form1.ADOQuery1.Open;
     index:=index+1;
    end;

你这是想干啥额?

在一个循环里面仅仅是读取下数据库?  这么做没意义的, 相当于你直接查询你cbb_DataName 列表里面的最后一个数据表。

可以写成
     TableName:='select * from %s where ServiceID like ''%s'' '); 
      IDName := '%'  + IDName + '%';
     TableName := Format(TableName, [cbb_DataName.Items[index], IDName ];
      form1.ADOQuery1.SQL.clear();
      form1.ADOQuery1.SQL.Add(TableName);

#2


1、建立使用内存表TDataSet,保存数据这样每读取一个表,将数读入TDataSet
2、通过这循环SQL语句,ADO读取数据即可。

#3


30个结构相同的表本身就不太合适吧,建议你改一改数据库的结构。

#4


   ServiceID:=form1.edtQuery.Text;
     index:=0;
     a:=form1.edtQuery.Text<>'';
     for index :=  TableCount-1 downto 0  do
     begin
      cbb_DataName.ItemIndex:=index;
      SQL_Str := 'select * from '+ cbb_DataName.Items[index]+'  where ServiceID like '+'"%'+ServiceID+'%"';
      form1.ADOQuery1.SQL.clear();
     // form1.Caption:=SQL_Str;
      form1.ADOQuery1.SQL.Add(SQL_Str);
      form1.ADOQuery1.Open;
     if ServiceID = form1.ADOQuery1.FieldByName('ServiceID').AsString then break;
     // Rzprogressbar1.PartsComplete := 30-index;
      end;

#5


谢谢诸位,已经解决