

我有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.
uj5u.com熱心網友回復:
while index<TableCount-1 dobegin
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);
uj5u.com熱心網友回復:
1、建立使用記憶體表TDataSet,保存資料這樣每讀取一個表,將數讀入TDataSet2、通過這回圈SQL陳述句,ADO讀取資料即可。
uj5u.com熱心網友回復:
30個結構相同的表本身就不太合適吧,建議你改一改資料庫的結構。uj5u.com熱心網友回復:
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;
uj5u.com熱心網友回復:
謝謝諸位,已經解決轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83486.html
標籤:數據庫相關
