我有30个结构都一样的表(见上图),然后我想通过输入一条记录的一个字段(比如说serviceID)然后遍历整个数据库 找到这个记录的所有字段的值,并显示出来,如下图
我现在所有表的名称已经获取到了,但是如何进行多表查询啊,我现在用循环的方法好像不行,不知道哪里搞错了。
下面是我的代码,由于我不是专业搞软件的。搞起来好折腾,求大神指点迷津
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);
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读取数据即可。
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);
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读取数据即可。
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
谢谢诸位,已经解决