http://zhidao.baidu.com/question/38810347.html
表是桌面数据库建的,有三个字段:用户类型,用户名,密码.我是建一个登陆系统,用户类型是用combobox选择的,就两个选项:管理员和普通用户.现在我想用locate的查找方法来查找用户名和密码并赋给edit1和edit2(主要是查找三个字段,把我弄糊涂了).
TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据。程序首先必须使用SQL命令从后端数据库中取得数据并且形成结果数据集,然后才使用Locate方法查寻数据。
当使用Locate方法查寻数据时,开发人员可以使用任何的字段条件来查寻,而无须理会这个字段是不是索引字段。当然,当开发人员使用索引字段来查寻数据时,Locate会直接使用索引来帮助查寻,因此速度会非常快速。如果开发人员使用非索引字段查寻数据,那么Locate也将使用目前它知道最好的方式来查寻数据。
此外,Locate方法不只能够查寻一个单一的字段,它同时还能以数个字段的条件来查寻数据。开发人员可以组合数个字段的查寻条件在结果数据集中查寻数据。
由于Locate能够查寻各种不同数据类型的字段,因此Locate方法在设定查寻条件时是以Variant类型的变量来储存查寻数值的。当开发人员要使用多个字段来查寻数据时必须建立一个Variant数组来储存查寻数值。
此外,Locate方法在查寻数据时也能够使用模糊条件标准来寻找特定的数据,例如开发人员可以要求Locate在查寻数据时不分大小写,或是以部分字符串来查寻数据,这样就为开发人员提供了非常大的弹性空间。
下面就是Locate的方法原型:
function Locate(const KeyFields: String; const KeyValues: Variant;
Options: TLocateOptions): Boolean;
Locate方法接受三个参数。第一个参数KeyFields是开发人员要查寻的字段名称。如果开发人员要查寻单一字段,那么只需要直接传入此字段名称。如果要以多个字段条件来查寻,那么便需传入所有的字段名称,并且以分号分隔每一个字段名称。
第二个参数KeyValues是指开发人员欲查寻的条件数值。它的类型是Variant,因为Variant几乎可以代表任何的类型,因此开发人员可以查寻整数、小数、字符串,或是布尔值的条件。同样,如果开发人员只查寻一个条件数值,那么就可以直接在这个参数位置传入。如果是以多个字段条件来查寻,那么开发人员必须建立一个Variant数组,然后在这个数组中的每一个元素中指定条件数值,再传递Variant数组到这个参数中。至于Variant数组则可以使用VarArrayOf方法,或是使用VarArrayCreate方法来建立,在稍后的范例中会有程序代码说明。
Locate方法的最后一个参数TLocateOptions则是让开发人员在查寻字符串字段时,指定以什么标准来查寻数据。开发人员可以指明不分大小写来查寻字符串数据,或是以部分字符串数值来查寻数据。下面就是TLocateOptions的类型定义:
type
TLocateOption = (loCaseInsensitive, loPartialKey);
TLocateOptions = setof TLocateOption;
在使用Locate时,如果使用loCaseInsensitive就代表不分大小写查寻数据;如果使用loPartialKey就代表要以部分字符串来查寻数据。
Locate方法的回传数值是布尔值,它代表Locate方法是否成功找到了要查寻的数据。如果找到,就回传True,否则就回传False。当Locate方法成功地查寻到数据之后,它就会移动目前的记录位置到这笔数据上,否则就会停留在Locate开始查寻之前的记录位置上。
请注意Locate方法查寻数据的结果是一笔数据,因此,如果你想查寻符合条件的一群数据,那么你可以使用稍后将介绍的过滤器(Filter)功能。
现在,让我们使用数个范例来说明如何使用Locate方法。下面的范例程序代码即是以一个字段来查寻数据,它是以数据表的NAME字段来查寻拥有“李维”数值的这笔数据,由于最后一个参数是空集合,因此,这代表NAME字段必须拥有一模一样的“李维”这个数值才算查寻成功。
aSQLClientDataSet.Locate('NAME', '李维' , []);
下面的程序代码则以City和District两个字段来查寻数据,查寻的条件是City字段拥有“台北”数值,而District字段拥有“大安区”数值的数据。
aSQLClientDataSet.Locate('City;District', VarArrayOf(['台北,大安区']),[]);
下面的程序代码和第一个范例非常相像,只是这个程序代码查寻的是第一笔在NAME字段以“李”数值开头的数据。
aSQLClientDataSet.Locate('NAME', '李', [loPartialKey]);
最后一个范例则是查寻ID字段中任何以“A12”数值开头的第一笔,而且是不分A大小写的数据。
aSQLClientDataSet.Locate('ID', 'A12', [loCaseInsensitive ,loPartialKey]);
现在就让我们使用Locate方法在范例应用程序中查寻数据。
单字段查寻
首先让我们以单一的字段来展示如何查寻数据,稍后再说明如何以多个字段查寻数据。现在请双击图4-3中的【Locate】按钮,并且在它的事件处理函数中撰写如下的程序代码:
dmSearchData.sqlcdsTest.Locate('SPECIES_NO', edtID.Text, [loCaseInsensitive, loPartialKey]);
这行程序代码使用数据模块中的TSimpleDataSet来查寻SPECIES_NO字段中包含用户在edtID这个TEdit控件中输入的数值。现在请执行这个范例应用程序,并且在主窗体右边的TEdit控件中输入数值来查寻数据。例如图4-4便是范例应用程序执行的画面。当我们在TEdit控件中输入90100并且点击【Locate】按钮之后,TSimpleDataSet便会立刻找到并且把目前的记录位置移动到这笔数据之上。
图4-4 Locate找到90100这笔数据
使用Locate方法查寻单一字段的数据是非常简单的,现在再让我们看看如何使用多个字段来查寻数据。
多字段查寻
请在Delphi中建立一个应用程序,并与上面的范例一样建立一个数据模块,并且传入TSQLConnection、TSimpleDataSet,连接到相同的范例数据库CHINESEDEMO.GDB。接着在主窗体中放入如图4-5所示的控件。在主窗体中我们使用了一个TComboBox,在这个TComboBox中将会填入范例数据表所有的字段名称,以便让用户可以自由选择要使用来查寻的字段。
另外,主窗体使用了一个TCheckListBox,它主要是用来储存所有用户输入的查寻条件。当用户在查寻字段中选择了一个字段,然后在查寻数值中输入了欲查寻的数值时,那么就可以点击主窗体中往下箭头的按钮把这个查寻条件加入到TCheckListBox中。当用户输入完所有查寻的条件之后,就可以点击主窗体中的【Locate】按钮以开始查寻数据。此时范例应用程序就会分析TCheckListBox中所有的查寻字段和查寻数值,再调用Locate以多个字段条件来查寻数据。
图4-5 范例应用程序的主窗体
例如图4-6就是这个范例应用程序执行的画面。首先,当范例应用程序执行后,用户便可以在TComboBox中选择欲查寻的字段,接着就可以在查寻数值控件中输入欲查寻的数值,接着点击往下箭头的按钮,加入查寻条件到TCheckListBox中,或是点击往上箭头的按钮,清除某一个查寻条件。
在TCheckListBox中的查寻条件是以:
查寻字段名称/查寻字段数值
为格式储存的,当用户点击了【Locate】按钮之后就会从TCheckListBox中一一地取出查寻条件,并且分析出查寻字段名称以及查寻字段数值,再放入到Locate方法的第一个以及第二个参数中。
图4-6 执行范例应用程序的画面
最后当输入完所有的查寻条件之后,用户就可以点击主窗体中的【Locate】按钮来查寻数据了。例如图4-7便是我们查寻TOPOTYPE字段包含“China”的数值,以及SPECIES_NAME字段以O字母为开头的数值。在点击了【Locate】按钮之后,范例应用程序调用Locate方法并且以多个字段为查寻条件,果然立即找到了这笔数据。
图4-7 以数个字段条件来查寻数据
这个范例应用程序是如何运作的呢?这个范例的应用程序执行了下列的工作:
1. 程序启动时在TComboBox中填入范例数据表所有的字段名称;
2. 点击往下箭头按钮把查寻字段和查寻数值加入到TCheckListBox中,以及点击往上箭头清除查寻条件;
3. 点击【Locate】按钮时从TCheckListBox中取出查寻条件,并且填入Locate方法的参数中,查寻数据。
现在就让我们实现以上的工作。首先在范例应用程序启动时,存取数据模块中TSimpleDataSet的Field对象的FieldName特性值以取得字段名称,再填入TComboBox中:
procedure TfrmMain.FormActivate(Sender: TObject);
var
iField : Integer;
begin
for iField := 0 to dmSearchData.sqlcdsTest.FieldCount - 1 do
begin
cbFields.Items.Add(dmSearchData.sqlcdsTest.Fields[iField].FieldName)
end;
cbFields.ItemIndex := 0;
end;
当点击往下箭头按钮时,取出TComboBox中选择的字段名称,以及查寻数值控件中输入的查寻数值,再检查TCheckListBox中是否已经存在了这个查寻字段,如果没有,就将字段名称加字段数值加入到TCheckListBox中。
此外,当点击往上箭头按钮时,我们就删除TCheckListBox中目前被选择的查寻条件。
procedure TfrmMain.sbtnAddClick(Sender: TObject);
begin
if (not AlreadyInCond(cbFields.Text)) then
begin
clbConditions.Items.Add(cbFields.Text + '/' + lblSearchValue.Text);
clbConditions.Checked[clbConditions.Count - 1] := True;
end;
end;
procedure TfrmMain.sbtnDeleteClick(Sender: TObject);
begin
try
clbConditions.Items.Delete(clbConditions.ItemIndex);
except
on Exception do;
end;
end;
最后,当用户点击了主窗体中的【Locate】按钮,范例应用程序就先检查用户是否输入任何的查寻条件。如果有,就调用GetSerchFields从TCheckListBox中取出所有的查寻字段名称,然后调用GetSearchValues取得所有用户输入的查寻数值,最后调用Locate方法来查寻数据。
其中的GetSearchValues会先调用VarArrayCreate方法以建立一个Variant数组,再于这个Variant数组中一一输入用户的查寻数值。
procedure TfrmMain.btnLocateClick(Sender: TObject);
var
sFields : String;
begin
lStart := GetTickCount;
if (CanSearch) then
begin
sFields := GetSerchFields;
dmSearchData.sqlcdsTest.Locate(sFields, GetSearchValues,
[loCaseInsensitive, loPartialKey]);
end;
lEnd := GetTickCount;
Self.Caption := FloatToStr((lEnd - lStart) /1000.0);
end;
function TfrmMain.GetSearchValues : Variant;
var
iCount : Integer;
sCond : String;
begin
Result := VarArrayCreate([0, Self.clbConditions.Items.Count - 1],
varVariant);;
for iCount := 0 to Self.clbConditions.Items.Count - 1 do
begin
sCond := Self.clbConditions.Items[iCount];
Result[iCount] := GetSearchValue(sCond);
end;
end;
function TfrmMain.GetSearchFields: String;
var
iCount : Integer;
sCond : String;
begin
Result := '';
for iCount := 0 to Self.clbConditions.Items.Count - 1 do
begin
sCond := Self.clbConditions.Items[iCount];
Result := Result + GetSearchField(sCond) + ';';
end;
Delete(Result, Length(Result), 1);
end;
function TfrmMain.CanSearch: Boolean;
begin
Result := Self.clbConditions.Items.Count > 0;
end;
function TfrmMain.GetSearchField(const sCond: String): String;
var
iPos : Integer;
begin
iPos := Pos('/', sCond);
Result := Copy(sCond, 1, iPos - 1);
end;
function TfrmMain.GetSearchValue(const sCond: String): String;
var
iPos : Integer;
begin
iPos := Pos('/', sCond);
Result := Copy(sCond, iPos + 1, Length(sCOnd) - iPos);
end;
function TfrmMain.AlreadyInCond(const sField: String): Boolean;
var
iCount : Integer;
sCond : String;
iPos : Integer;
begin
Result := False;
for iCount := 0 to clbConditions.Items.Count - 1 do
begin
sCond := clbConditions.Items[iCount];
iPos := Pos(sField, sCond);
if (iPos <> 0) then
begin
Result := True;
Break;
end;
end;
end;
上面的范例展示了如何使用Locate方法以多个字段条件来查寻数据。由于Locate方法的第二个参数是Variant类型,因此,我们几乎可以查寻任何类型的字段。Locate方法非常适合在所有数据已经存在于结果数据集中的应用,但是对拥有大量记录的数据表却不见得适合,在稍后的小节中,本章会继续讨论如何使用Locate在大量的数据中查寻数据。
分享到:
相关推荐
linux中locate命令使用介绍.docx
Delphi7调用SQLite数据库使用方法: 1. 在项目中添加SQLite3.pas、SQLiteTable3.pas这2个文件. 2. 编写调用sqlite代码. 如测试程序Project1.exe 3. 将sqlite3.dll放在Project1.exe同一目录下即可使用. 4. 调用并查询...
主要介绍了Ubuntu16.04 中 locate文件查找命令,需要的朋友可以参考下
Delphi中按日期查询的解决办法 引言: Delphi是开发桌面数据库程序最佳的选择之一,其快速的数据建模和集成数据开发控件,为数据库的开发提供了最佳的解决方案。 程序开发过程中,查询是数据库程序最基本的操作类型...
在linux中有很多查找命令,今天小编抽空给大家讲解find和locate两个命令,非常不错,具有参考借鉴价值,需要的朋友参考下吧
Locate32根据存储在数据库中的文件和文件夹名称查找文件和目录。 Locate32将硬盘驱动器上所有文件的名称保存到数据库中。 一旦建立文件索引,您就可以使用应用程序的搜索表单快速找到文件。 它的工作方式类似于Unix...
Locate32(文件查找)绿色汉化版 V3.1 build 8.09210
Linux基础课件Linux系统文件查找locate命令共13页.pdf.zip
Locate32 v3.1 RC3l build 10.8220(包含中文语言文件,需在设置中选择) 小巧的本地搜索,Locate32根据存储在数据库中的文件和文件夹名称查找文件和目录
汉化过的增强搜索软件locate32 汉化过的增强搜索软件locate32
11.4.4 Locate 234 11.5 修改记录 234 11.6 插入和删除记录 235 11.7 数据模块 237 11.8 数据字典查看器 238 11.9 事务 240 11.10 处理数据库异常 244 第12章 InterBase服务器 248 12.1 客户/服务器的概念 248 ...
很好用的文件查找工具 只要更新数据库 电脑再多文件都不拍,键入文件名 ,立马找到
linux文件名查找which,whereis,locate.docx
Locate32根据存储在数据库中的文件和文件夹名称查找文件和目录。 Locate32 将硬盘驱动器上所有文件的名称保存到数据库中。 文件索引完成后,您可以使用应用程序的搜索表单快速定位文件。 它的工作方式类似于Unix中的...
Locate32是一款极品磁盘文件搜索工具,让你更快更详细的搜索到你想要的文件!
11.4.4 Locate 234 11.5 修改记录 234 11.6 插入和删除记录 235 11.7 数据模块 237 11.8 数据字典查看器 238 11.9 事务 240 11.10 处理数据库异常 244 第12章 InterBase服务器 248 12.1 客户/服务器的概念 248 ...
在执行 perl Makefile.PL 报错如下,简单记录一下解决方法 # perl Makefile.PL Can’t locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl...
Can't locate ThreadQueue.pm
可以让你快速地找到目标文件的搜索工具。通过使用数据库技术把文件(可指定任意硬盘、目录及其他存放媒体上的文件)的相关资料保存起来后,在搜索时直接搜索数据库记录达到即搜即有的效果