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方法的區別是一樣的。