15.4.2.2 查找數據庫表中的記錄
如果想查找數據庫表中的記錄,必須想指定查找記錄的一些字段的字段值,然後在表中進行檢索,檢索出與查找值相匹配的記錄來。如果我們是在Paradox或dBASE數據庫中的表中查找記錄,那麼查找值所對應的字段必須是表中的關鍵字段或輔助索引字段。如果查找SQL數據庫服務器中的表,那麼查找值必須是表的IndexFieldNames屬性中指定的字段。
Delphi提供了兩種方式在數據庫表中查找記錄:Goto方式和Find方式。這兩種方式十分相似,它們的主要區別在於為查找指定查找值的方法不一樣。
使用Goto方式進行數據查找使用的方法有SetKey方法、GotoKey方法和GotoNearest方法。其實際步驟如下:
①確保要查找的字段是關鍵字段或輔助索引字段。
②調用SetKey方法把與表對應的TTable部件置成查找狀態。
③把查找值賦給相應的字段。
④調用GotoKey方法,並測試它的返回值檢驗查找是否成功。
假設Table1對應的表中第一個字段是關鍵字段,Edit1是應用窗體中的一個編輯框,用戶可以通過Edit1輸入查找值。下面的代碼將通過Goto方式進行查找。
Table1.SetKey; {將Table1置成查找狀態}
Table1.Field[0].AsString := Edit1.Text; {指定查找值}
Table1.GotoKey; {進行查找}
上面最後一行代碼是根據用戶指定的查找值,在表中執行查找。查找的結果有兩種,也許成功也許失敗,這是由調用GotoKey方法之後返回的布爾值來決定,如果返回True,那麼查找成功,並且記錄指針會指向與查找值匹配的記錄,如果返回Fale,那麼查找失敗,記錄指針的位置不發生變化。下面的代碼可以測試調用GotoKey方法之後的返回值,告知用戶查找是否成功。
Table1.SetKey;
Table1.Field[0].AsString:= 'Smith';
If not Table1.GotoKey then
ShowMessage('記錄沒找到')
在這一段代碼中,如果在表中沒有找到第一個字段值為Smith的記錄,該應用程序會彈出一個對話框告知用戶“記錄沒有找到”。
如果在表中存在多個關鍵字段或輔助索引中包含多個字段時,你在進行查找時,只想為第一個字段指定查找值,那麼必須要設置TTable部件的KeyFieldCount的屬性值為1。如果想為多個字段指定查找值,只能為相鄰的字段指定查找值,例如輔助索引中共有三個字段,那麼我們只能為第一個字段、第一和第二個字段、第一和第二以及第三個字段指定查找值,而不能為第一和第三個字段指定查找值。
GotoNearest方法的使用與GotoKey方法完全一樣,只是它用於不精確查找,它不要求查找結果與查找值精確匹配,當表中有與查找值精確匹配的記錄時,它將記錄指針移到該記錄處,當表中沒有與查找值精確匹配的記錄時,它會查找出與查找值最接近的記錄,並將記錄指針移到該記錄處。
下面是應用GotoNearest方法的一段代碼:
Table1.SetKey;
Table1.Fields[0].AsString:= 'Sm';
Table1.GotoNearest;
執行上述代碼後,若表中存在第一個字段值等於Sm的記錄時,記錄指針將移到該記錄處,若表中不存在第一個字段值等於Sm的記錄,而存在第一個字段值等於Smith的記錄,那麼記錄指針會移到該記錄處。
如果我們不是以數據庫表中的關鍵字段作為查找字段,我們也可以為TTable部件的IndexFieldName屬性中的字段或IndexName屬性中的字段指定查找值進行數據查找。例如,假設Customer表中有一個名叫CityIndex的輔助索引,我們為CityIndex中的字段指定查找值進行查找時,首先設置TTable部件的IndexName屬性為CityIndex,然後再進行查找,下面是具體的程序代碼:
Table1.IndexName := 'CityIndex';
Table1.Open;
Table1.SetKey;
Table1.FieldByName{'City').AsString := Edit1.Text;
Table1.GotoKey;
使用Find方式:使用Find方式在數據庫中進行數據查找的方法有:FindNearest方法和FindKey方法。
FindKey方法和FindNearest方法為數據查找提供了一個簡單的方法,它們將SetKey、指定查找值、執行查找三個步驟融合在一步裡完成,它們在指定查找值時,是把各字段的查找值組成一個數組傳給FindKey或FindNearest。下面是使FindKey方法的一個例子。
假設Tabel1對應的表中的第一個字段是關鍵字段。
Table.FindKey([Edit1.Text]);
如果用GotoKey方法完成這一功能則需要編寫下面代碼:
Table1.SetKey;
Table1.Fields[0].AsStrine := Edit.Text;
Table1.GotoKey;
FindKey方法和FindNearest方法的區別與GotoKey和GotoNearest方法的區別是一樣的。
15.4.2.3 創建主要──明細數據庫應用
TTable部件中MasterSource屬性和MasterFields屬性是用於定義兩個數據庫表的一對多的關系。MasterSource屬性指定主表對應的TDataSource部件,MasterFields屬性指定主表和明細表之間建立聯系的字段,主表和明細表之間建立一對多關系時,可能不只是基於一個字段,可能有多個字段。如果有多個字段,那麼在說明MasterFields屬性時,多個字段之間要用分號隔開。如Table1.MasterFields := 'OrderNo;CustNo'。在設計階段可以使用字段連接設計器(Field Link Designer)為兩上表創建一對多的關系,在Object Inspector 中雙擊TTable部件的MasterFields便可以打開Field Link Designer,進行一對多關系的創建。 如創建Customer.DB表和Order.DB表之間的一對多關系時,使用Field Link Designer 如圖15.5所示。
圖15.5 使用Field Link Designer創建一對多關系
Field Link Designer提供了一種可視化的方法來創建主要──明細表之間的一對多關系。圖中Available Indexes組合框中存放著明細表中的關鍵字段和索引字段,可以選擇索引字段進行連接。在主表中選擇一個用於連接的關鍵字段,然後將其與明細表中相應的關鍵字段連接,單擊Add按鈕,主要──明細表的連接字段將顯示在Joined Fields列表框中,如:
CustNo->CustNo
15.5 TDataSource部件及其應用
TDataSource部件是開發數據庫應用程序中用到的非常重要的部件,它是連接數據集部件TTable或TQuery和數據浏覽部件的橋梁。TDataSource部件本身十分簡單,它所擁有的屬性、事件和方法都比較少,在使用該部件時無需作太多的工作,它主要是為數據浏覽部件服務的,如果在應用程序中沒有使用數據浏覽部件,我們也沒有必要為應用程序設置TDataSource部件。