在我們對數據庫進行操作時,經常用到TTable控件,但TTable只能同時對一個數據表進行操作,而TQuery控件不僅具有TTable的多數功能,而且同時可對多個數據表進行操作。不僅如此,TQuery控件還有更強大的數據庫查詢功能,可以同時對多個不同結構的數據庫進行關聯查詢,被查詢的數據庫可以是ODBC支持的任何一種類型,當然計算機中必須先安裝ODBC和BDC(Delphi的數據庫引擎),現舉例說明。
一、連接Paradox和dBASE進行異庫查詢
例如:Master.db和Customer.dbf分別為Paradox和dBASE的數據庫,它們有一個公共字段CustNo。這時可輸入如下代碼:
Query1.Close;
Query1.DataBaseName:=′′;
Query1.SQL.Clear;
Query1.SQL.Add(′Select * from ″Master.db″ A,″Customer.dbf ″ B Where A.CustNo=B.CustNo′);
{在同一行內輸入}
Query1.Open;
注意:進行多庫聯查時,TQuery控件的DataBaseName屬性必須先置空,單引號內不包含任何字符;A和B分別是Master.db和Customer.dbf的別名(引用別名可減少代碼長度)。
二、MS Access的多表聯查
Access數據庫屬於多表集合數據庫(一個數據庫中包含多個數據表),所以,對兩個Access數據庫進行查詢的方法就與上述有所不同。例如:我們有RSDA.mdb和ZFGjj.mdb兩個數據庫,RSDA中包含人事檔案、在職職工目錄和離職職工目錄等數據表,ZFGjj通過公共字段“用戶號”與RSDA相連。如果我們從ZFGjj中提取一個用戶號,需要從RSDA中得到擁有此用戶號的職工姓名,這時就必須用到TQuery的多表查詢。
第一步 在ODBC中增加兩個數據源“ZFGjj”和“RSDA”。
第二步 在BDE數據庫引擎中添加兩個數據庫列名“ZFGjj”和“RSDA”。
第三步 在表單中增加兩個DataBase控件“DataBase1”和“DataBase2”,在AliasName屬性中分別選擇“ZFGjj”和“RSDA”,DataBaseName屬性中分別鍵入“ZFGjj”和“RSDA”,最後將KeepConnection和Connected屬性都設為“True”。
現在可以輸入相應的代碼了:
Begin
For I:=1 To 10 Do
Begin
Query1.Close;
Query1.DataBaseName:=′′;
Query1.Sq1.Clear;
Query1.Sq1.Add(′Select A.七月,B.個人賬號,B.用戶號,C.姓名From“:ZFGjj:個人匯激部門表”A,“:ZFGjj:住房公積金明細表”B,“:RSDA:在職職工目錄”C
Where(A.用戶號=B.封存=:ib)′);{在同一行輸入}
Query1.Prepare;
Query1.Params[0].DataType.=ftInteger;
Query1.Params[1].DataType.=ftBoolean;
Query1.Params[0].Asinteger:=ia[I];
Query1.Params[1].Asboolean:=ib;
Query1.Open;
End;
End;
代碼中SQL語句必須在一行內輸入,不能分行。SQL語句中使用了動態參數“ia”和“ib”,Delphi會自動按參數出現的順序將它們添加在Query1的Params屬性中並分配索引號分別為0和1,參數“ia”和“ib”應在程序開始時聲明其類型並賦值。