许多学者总会面对于数据库的知识,以下的例子讲述到Access数据库说明,用C#的DataSet类访问数据库的一些 *** 作方法。
*** 作涉及的主要C#类有:
DataSet:对应数据库表的一个集合,实际上是数据库表在内存中的一个缓存
DataTable:对应数据库表,是数据库表行的集合
DataRow:对应数据库表行
OleDbConnection:建立数据库连接
OleDbDataAdapter:由数据库生成DataSet,并负责DataSet与数据库的同步
OleDbCommandBuilder:生成更新数据库所需的指令www.kmxxfk.com
DataSet、DataTable、DataRow用于数据在缓存中的 *** 作,这上面的 *** 作只有更新到数据库中,修改结果才会被永久保存。OleDbConnection 是用OLEDB方法连接数据库所必需的。OleDbDataAdapter和OleDbCommandBuilder用来生成DataSet,完成数据库更新。与OleDbDataAdapter和OleDbCommandBuilder相对应,SqlDataAdapter和SqlCommandBuilder也可以完成用SQL语言为指令的数据库更新。
假设在D:盘创建了Access数据库,其路径为d:\\0DBAcs\\account.mdb,数据库中有一张名为kaizhi的数据库表。表结构如下:
表名;Kaizhi
字段Field Name类型说明
1开支IDkzID长整型自动编号
2开支人Kzren文本50字符
3开支项目名kzname文本50字符
4日期riqi日期/时间99-99-99;0掩码
5开支说明shuoming文本225字符
6总金额zonge单精度小数点任意;这项开支的总花费
7数量shuliang长整型 www.kmxxfc.com
8单价Danjia单精度小数点任意
表建好之后:(1)对表中添加新数据(2)查询表中的某个字段。为了实现这两项功能,以下几个问题要考虑:
1准备工作
声明必须的公共变量
建立与数据库的连接,创建DataSet对象
2添加记录
在DataSet对象上添加记录
同步DataSet对象对象与数据库中的数据,这一点很重要,很多人忘记了数据进行同步,结果往往是添加、修改的数据不能保存到数据库中。
3查询数据库表中某记录的某字段;
我们可以将上述功能用一个类DataOper实现,下面是程序设计的主要活动。
声明要用的C#系统类
using System
using System.Collections.Generic
using System.Text
using System.IO
using System.Data
using System.Data.OleDb
using System.Data.SqlClient
声明DataOper类中的公共变量
private string DBlocation
private OleDbConnection dbconn//数据库连接
private OleDbDataAdapter da
建立与数据库的连接,这里采用了OLEDB方法:
dbconn = new OleDbConnection(@"provider=microsoft.jet.oledb.4.0Data Source=d:\\0DBAcs\\account.mdb")
dbconn.Open()
创建DataSet对象
da = new OleDbDataAdapter(@"select * from kaizhi", dbconn)//引用数据库连接dbconn并依据SQL语句"select * from kaizhi"创建OleDbDataAdapter对象da
DataSet ds = new DataSet()//创建DataSet对象
da.Fill(ds)//用OleDbDataAdapter对象da填充、更新刚创建的DataSet对象
添加记录并更新数据库
OleDbCommandBuilder cb = new OleDbCommandBuilder(da)// 创建OleDbCommandBuilder对象cb用于更新OleDbDataAdapter对象da的Insert、Delete、Update指令
da.UpdateCommand = cb.GetUpdateCommand()//更新OleDbDataAdapter对象da的指令
设计人员可以编写自己的更新指令,也可以象上面所写的那样用系统默认的指令。但不管怎样,上面的语句不能缺少,否则程序在运行中会抛出异常System.InvalidOperationException,并提示:Update requires a valid InsertCommand when passed DataRow collection with new rows.
DataRow drx = ds.Tables[0].NewRow()//创建一条新记录行
drx["kzren"] = "kzren"
drx["kzname"]="kzname"
drx["riqi"]=2008-10-11
drx["shuoming"]="shuoming"
drx["zonge"] = 12
drx["shuliang"] = 3
drx["danjia"] = 4
ds.Tables[0].Rows.Add(drx)//在表中追加记录
da.Update(ds)//更新数据库
要查询引用某记录的某字段,直接按如下的方法引用就可以了。
String kx=ds.Tables[0].Rows[0]["kzren"].ToString()
连接access
首先看一个例子代码片断:
程序代码:www.lzfsk.com/
--------------------------------------------------------------------------------
using system.data
using system.data.oledb
......
string strconnection="provider=microsoft.jet.oledb.4.0"
strconnection+=@"data source=c:\\begas.Net\\northwind.mdb"
oledbconnection objconnection=new oledbconnection(strconnection)
......
objconnection.open()
objconnection.close()
......
--------------------------------------------------------------------------------
解释:
连接access数据库需要导入额外的命名空间,所以有了最前面的两条using命令,这是必不可少的!
strconnection这个变量里存放的是连接数据库所需要的连接字符串,他指定了要使用的数据提供者和要使用的数据源.
"provider=microsoft.jet.oledb.4.0"是指数据提供者,这里使用的是microsoft jet引擎,也就是access中的数据引擎,ASP.net就是靠这个和access的数据库连接的.
"data source=c:\\begaspnet\\northwind.mdb"是指明数据源的位置,他的标准形式是"data source=mydrive:mypath\\myfile.mdb".
ps:
1."+="后面的"@"符号是防止将后面字符串中的"\\"解析为转义字符.
2.如果要连接的数据库文件和当前文件在同一个目录下,还可以使用如下的方法连接:
strconnection+="data source="
strconnection+=mappath("northwind.mdb")
这样就可以省得你写一大堆东西了!
3.要注意连接字符串中的参数之间要用分号来分隔.
"oledbconnection objconnection=new oledbconnection(strconnection)"这一句是利用定义好的连接字符串来建立了一个链接对象,以后对数据库的 *** 作我们都要和这个对象打交道.
"objconnection.open()"这用来打开连接.至此,与access数据库的连接完成.其余 *** 作(插入,删除...)请参阅相关书籍
连接SQL Server
例子代码片断:
程序代码:
--------------------------------------------------------------------------------
using system.data
using system.data.sqlclient
...
string strconnection="user id=sapassWord="
strconnection+="initial catalog=northwindserver=yoursqlserver"
strconnection+="connect timeout=30"
sqlconnection objconnection=new sqlconnection(strconnection)
...
objconnection.open()
objconnection.close()
...
--------------------------------------------------------------------------------
解释:
连接sql server数据库的机制与连接access的机制没有什么太大的区别,只是改变了connection对象和连接字符串中的不同参数.
首先,连接sql server使用的命名空间不是"system.data.oledb",而是"system.data.sqlclient".
其次就是他的连接字符串了,我们一个一个参数来介绍(注意:参数间用分号分隔):
"user id=sa":连接数据库的验证用户名为sa.他还有一个别名"uid",所以这句我们还可以写成"uid=sa".
"password=":连接数据库的验证密码为空.他的别名为"pwd",所以我们可以写为"pwd=".
这里注意,你的sql server必须已经设置了需要用户名和密码来登录,否则不能用这样的方式来登录.如果你的sql server设置为Windows登录,那么在这里就不需要使用"user id"和"password"这样的方式来登录,而需要使用"trusted_connection=sspi"来进行登录.
"initial catalog=northwind":使用的数据源为"northwind"这个数据库.他的别名为"database",本句可以写成"database=northwind".
"server=yoursqlserver":使用名为"yoursqlserver"的服务器.他的别名为"data source","address","addr".如果使用的是本地数据库且定义了实例名,则可以写为"server=(local)\\实例名"如果是远程服务器,则将"(local)"替换为远程服务器的名称或ip地址.
"connect timeout=30":连接超时时间为30秒.
在这里,建立连接对象用的构造函数为:sqlconnection.
其余的就和access没有什么区别了!
********************************************************************************************************************
用c#访问access数据库
我编写这个程序的动机是当我希望用c sharp访问msaccess数据库的时候我没有办法获得任何信息和参考材料.网上所能获得的所有材料都是偏重于sql的,所以我们将分两步来编写这个应用程序,第一我们将展示如何连接到msaccess数据库然后看看它有多复杂.最后,我们就这样完成了这个程序.
闲言少序,让我们开始正题.连接到数据库的过程与我们早先的ado连接过程相比已经发生了较大的变化.下面的图表恰当的(我希望如此)oledbconnection-->oledbcommand -->oledbdatareader.现在那些熟悉ado的人很明显能看出两者的相似之处但是为了使那些还没有很好的适应ado的人能够明白,下面是一些解释.
oledbconnection -->代表对数据库的单一连接,根据底层数据库的功能它能给你 *** 纵数据库的能力.有一点必须记住,虽然oledbconnection对象出了作用范围,它也不会自动被关闭.所以,你将不得不显示的调用这个对象的close()方法.
oledbcommand -->这是就象我们在ado中使用的一样的通常的command对象.你可以通过这个对象调用sql存储过程或是sql查询语句.
oledbdatareader -->这个类拥有非常大的重要性因为它提供了实际上的对数据库底层数据集的访问.当你调用oledbcommand的executereader方法的时候它就会被创建,.net beta2 sdk说不要直接创建这个类的对象.
现在你可以在.net beta 2的文档中看到更多的关于这些主要对象的说明,下面是指出如何在程序中访问数据库的源代码.
using system
using system.data.oledb
class oledbtest{
public static void main()
{
/创建数据库连接
oledbconnection aconnection = new oledbconnection("provider=microsoft.jet.oledb.4.0data source=c:\\\\db1.mdb")
/创建command对象并保存sql查询语句
oledbcommand acommand = new oledbcommand("select * from emp_test", aconnection)
try
{
aconnection.open()
/创建datareader 对象来连接到表单
oledbdatareader areader = acommand.executereader()
console.writeline("this is the returned data from emp_test table")
/循环遍历数据库
while(areader.read())
{
console.writeline(areader.getint32(0).tostring())
}
/关闭reader对象
areader.close()
/关闭连接,这很重要
aconnection.close()
}
/一些通常的异常处理
catch(oledbexception e)
{
console.writeline("error: {0}", e.errors[0].message)
}
}
}
成功运行这个程序的步骤
1.用msaccess创建一个名叫db1.mdb的数据库
2.创建一个名叫emp_test的表单
3.使它包含下列数据域
emp_code int
emp_name text
emp_ext text
4.将上面的代码保存到sample.cs文件中
5.确保数据库位于c:\\并确保mdac2.6或是更新的版本已经被安装
6.编译运行
现在让我们来了解一些我们在oledbconnection对象的构造函数看到的东西的一些细节,在这里你看见诸如"provider="之类的东西.下面是一些和ado.net兼容的驱动程序类型.
sqlolddb -->microsoft ole db provider for sql server,
msdaora -->microsoft ole db provider for Oracle,
microsoft.jet.oledb.4.0 -->ole db provider for microsoft jet
你可以选择其中的任何一个但是他们会需要传递不同的参数,例如jet.oledb.需要传递mdb文件的名字而sqloledb需要传递用户名和密码.
所有这些驱动程序都位于system.data.oledb命名空间里,所以你必须包括它,而且它们和oledb provider for odbc不兼容,也就是说你不能在VB6.0程序里使用这些驱动程序来访问数据库,所以不要去寻找解释为什么要把这些数据库放在c:\\上的资料了
当你使用microsoft sql server 7.0 或者更新版本的时候,下面是微软给出的一些指导:
推荐使用.net data provider在下列情况中,使用microsoft sql server 7.0 或者更新版本的中间层应用程序,使用microsoft data engine (msde)或icrosoft sql server 7.0 或者更新版本的单层应用程序.
建议将ole db provider for sql server (sqloledb)和ole db .net data provider一起使用.
对于microsoft sql server 6.5和更早的版本,你必须同时使用ole db provider for sql server 和 ole db.net data provider.
推荐使用microsoft sql server 6.5和更早的版本或是oracle的中间层应用程序使用ole db .net data provider.
对于microsoft sql server 7.0 或者更新版本,推荐sql server .net data provider.
推荐单层应用程序使用microsoft access数据库.
不推荐一个中间层程序同时使用ole db .net data provider和microsoft access数据库.
不再支持ole db provider for odbc (msdasql)
下面是ClientDataSet的用法,希望对楼主有用 TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和 *** 作的控件。该控件封装了对数据进行 *** 作处理的接口和功能,而本身并不依赖上述几种数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要。1.TClientDataSet的基本属性和方法介绍1).FieldDefs: 字段定义列表属性开发者可通过单击属性编辑器中该属性编辑按钮,或在该控件上单击右键选择d出菜单中的"Fields Editor"菜单进行字段编辑。设置完此属性后,实际上就相当于定义了表的结构;如果想装入已有的数据表的结构和数据,可通过单击右键选择d出菜单中的"Assign Local Data"菜单,从d出对话框中选取当前窗体中已与数据库连接好的数据集控件名称即可(当前窗体中必须已放置好要套用的数据集控件并打开激活)。使用注意:对于自定义的字段名表,该属性编辑完后,该控件仍然无法打开。必须右键单击该控件,选择d出菜单中的"Create DataSet"菜单,让该控件以上述编辑的字段列表为依据,创建数据集后,才能够被激活打开和使用。否则,会出现类似"ClientDataSet1: Missing data provider or data packet."的错误(包括在运行期,运行期可调用该控件的CreateDataSet方法,从而动态定义字段和表)。2).FileName属性说明:数据存储文件的名称。因该控件是基于文件型的数据 *** 作控件,因此,必须指定所 *** 作的数据文件名称(默认扩展名称.cds),从而打开和激活该控件,进而进行数据编辑。例1:利用此属性打开指定的.cds文件var
Path: string
begin
Path := ExtractFilePath(Application.ExeName)//取得可执行文件路径
CDataSet1.FileName := Path + 'test.cds'
CDataSet1.Open
end3).CreateDataSet方法说明:该方法以FieldDefs中的字段名表为结构建立数据集,常用来进行动态定义表。例2:动态创建一具有姓名和年龄两个字段的数据集。//创建字段名表
CDataSet.FieldDefs.Clear
with CDataSet.FieldDefs.AddFieldDef do
begin
Name := 'Name'
Size := 10
DataType := ftString
end
with CDataSet.FieldDefs.AddFieldDef do
begin
Name := 'Age'
DataType := ftInteger
end
//动态创建数据集
CDataSet.CreateDataSet
//激活和打开该数据集
CDataSet.Open4).Open方法说明: 打开和激活数据集控件,从而进行数据编辑。a. 如果指定了FileName属性,则直接用Open方法即可打开和激活该控件,见例1。b. 如果未指定FileName属性,可使用例2方法动态创建和打开数据集,进而 *** 作数据。5).LoadFromFile和SaveToFile说明:从文件中装入表结构和数据以及存储数据到文件。该方法类似于Word中的打开新文件和另存为的功能。例3:将数据集的数据存储到指定文件中CDataSet.SaveToFile('c:\windows\desktop\test.cds')6).First(到首),Prior(向前),Next(向后),Last(到尾),Edit(编辑),CanCel(取消编辑),Post(保存),Insert(插入记录),Append(添加记录),Delete(删除),Refresh(数据刷新)等数据集常用方法说明:当指定了FileName属性时,其Post方法可将数据存入指定的文件中,类似其SaveToFile方法;如果未指定存储文件名,则Post方法只将数据存储在RAM中。其它方法,同一般数据集控件使用方法,略。7).Filter, Filtered: 过滤筛选属性说明:用于筛选指定条件的记录,用法同一般数据集控件,略。例4:在已经激活打开的数据集中筛选性别为男性的记录CDataSet.Close
CDataSet.Filter := '性别=''' + '男' + ''''
CDataSet.Filtered := True
CDataSet.Open2.使用TClientDataSet控件的应用程序发布的注意事项:如前所述,使用TClientDataSet控件的程序发布时不需要任何数据库驱动程序,大大节省了安装文件的大小。但是,在发布程序时别忘了将Windows系统目录下midas.dll(257KB)与应用程序一起发布(运行必须),否则,程序仍然无法正常运行。三、结束语通过使用Delphi中TClientDataSet控件,既实现了应用程序可彻底脱离数据库驱动程序,也实现了常规数据集控件简单易用的特性,为编写"瘦"数据库应用程序提供了一种技术方法和手段。上述程序在Pwindows98,Delphi5下测试通过。
TClientDataSet在三层结构中,TClientDataSet的地位是不可估量的,她的使用正确与否,是十分关键的,本文从以下几个方面阐述她的使用,希望对你有所帮助.
1.动态索引
procedure TForm1.DBGrid1TitleClick(Column: TColumn)
begin
if (not column.Field is Tblobfield) then//Tblobfield不能索引,二进制
ClientDataSet1.IndexFieldNames:=column.Field.FieldName
end
2.多层结构中主从表的实现
设主表ClientDataSet1.packetrecord为-1,所有记录
设从表ClientDataSet1.packetrecord为0,当前记录
3.Taggregates使用
(1)在字段编辑中add new field类型为aggregates
后设置expression(表达试)
设置active:=true即可
使用dbedit的field为前者即可
(2)使用Aggergates属性add设计表达试
调用
showmessage(floattostr(ClientDataSet1.Aggregates.Count))
showmessage(ClientDataSet1.Aggregates.Items[0].Value)
4.在单层数据库中不要BDE
使用ClientDataSet代替table,使用ClientDataSet的loadfilename装入cds
代替table的tablename的db或者dbf
原来的程序改造方法:
加一个ClientDataSet,使用右键assign locate data
后savetofile,再loadfromfile,后删除table
将原连table的datasource设为ClientDataSet
唯一注意的是:要将midas.dll拷到system或者当前目录
5.三层结构的公文包的实现方法
同时设定1:filename(*.cds)2.remote server
6.可以对data赋值(从另一个数据集取值)
ClientDataSet2.Data:=ClientDataSet1.Data
ClientDataSet2.Open
或者
ClientDataSet2.CloneCursor(ClientDataSet1,true)
ClientDataSet2.Open
7.附加数据取得
客户程序向应用服务器请求数据。如果TClientDataSet 的
FetchOnDemand 属性设为True,
客户程序会根据需要自动检索附加的数据包如BLOB字段的值或嵌套表的内容。
否则,
客户程序需要显式地调用GetNextPacket 才能获得这些附加的数据包。
ClientDataSet的packetrecords设置一次取得的记录个数
8.ClientDataSet与服务器端query连接方法
(1)sql内容为空
ClientDataSet1.Close
ClientDataSet1.CommandText:=edit1.Text//即sql内容
ClientDataSet1.Open
对于没有应用服务器设置filter 如:country like 'A%'
filtered=true可实现sql功能
(2)有参数
如服务端query的sql为
select * from animals
where name like :dd
则:客户端ClientDataSet
var
pm:Tparam
begin
ClientDataSet1.Close
ClientDataSet1.ProviderName:='DataSetProvider1'
pm:=Tparam.Create(nil)
pm.Name:='dd'
pm.DataType:=ftString
ClientDataSet1.Params.Clear
ClientDataSet1.Params.AddParam(pm)
ClientDataSet1.Params.ParamByName('dd').AsString:=edit1.Text
ClientDataSet1.Open
pm.Free
end9.数据的更新管理
(1)savepoint 保存目前为止数据状态,可以恢复到这个状态
var
pp:integer
begin
pp:=ClientDataSet1.SavePoint
ClientDataSet1.Edit
ClientDataSet1.FieldByName('姓名').asstring:='古话'
ClientDataSet1.Post
table1.Refresh
end
恢复点
ClientDataSet1.SavePoint:=pp
(2)cancel,RevertRecord
取消对当前记录的修改,只适合没有post的,如果post,调用
RevertRecord
(3)cancelupdate
取消对数据库所有的修改
(4)UndoLastChange(boolean),changecount
取消上一次的修改,可以实现连续撤消
参数为true:光标到恢复处
false:光标在当前位置不动
changecount返回修改记录的次数,一个记录修改多次,返回只一次
但UndoLastChange只撤消一次
10.可写的recno
对于Ttable和Tquery的recno是只读的,而TClientDataSet的recno可读可写
ClientDataSet1.recno:=5是设第五个记录为当前记录
11.数据保存
对于table使用post可更新数据
而ClientDataSet1的post只更新内存数据,要更新服务器数据要使用
ApplyUpdates(MaxErrors: Integer),他有一个参数,是允许发出错误的
次数,-1表示无数次,使用simpleobjectbroker时常设为0,实现自动容错和负载平衡
====================================================== 影响ClientDataSet处理速度的一个因素
TClientDataSet是Delphi开发数据库时一个非常好的控件。有很强大的功能。
我常常用ClientDataSet做MemoryDataSet来使用。还可以将ClientDataSet的数据保存为XML,这样就可以做简单的本地数据库使用。还有很多功能就不多说了。在使用ClientDataSet的过程中关于怎样提高处理速度这个问题,我就我个人的一点点体会和大家分享一下。
通常情况下我们一般都是用
...ClientDataSet-->DataSource-->DBComponent
这样的结构,处理数据的时候就直接 *** 作ClientDataSet。但是大多DBComponet都会立即响应ClientDataSet的变化。如果你是向ClientDataSet中插入很多数据时候,DBComponent就要响应几次,而且响应过程根据不同的控件,速度,过程数量都不一样。这样就影响了程序的执行效率。所以在对ClientDataSet处理中,我是用ClientDataSet.DisableControls和ClientDataSet.EnableControls方法:打开和关闭DBComponent与ClientDataSet的数据显示关系。
例如:
ClientDataSet..DisableControls
...
for I := 0 to 10000 do
begin
ClientDataSet.Append
...
ClientDataSet.Post
end
...
ClientDataSet.EnableControls
...
这样做以后你会发现处理速度比以前没有使用方法的时候有成倍的提高。
ClientDataSet的数据查找。
我所介绍的心得和技巧都是用ClientDataSet来做范例,也可以应用于其他的一些DataSet。废话就不多说了。我们还是先看代码,让后再总结。
1.Scanning 扫描数据查找
这是最简单最直接也是最慢的一种方法,遍历所有数据:
procedure TForm1.ScanBtnClick(Sender: TObject)
var
Found: Boolean
begin
Found := False
ClientDataSet1.DisableControls
Start
try
ClientDataSet1.First
while not ClientDataSet1.Eof do
begin
if ClientDataSet1.Fields[FieldListComboBox.ItemIndex].value =
SearchText then
begin
Found := True
Break
end
ClientDataSet1.Next
end
Done
finally
ClientDataSet1.EnableControls
end
if Found then ShowMessage(SearchText +
' found at record ' + IntToStr(ClientDataSet1.RecNo))
else
ShowMessage(ScanForEdit.Text + ' not found')
end
2.Finding 寻找数据
最老,但是最快的查找方式。
使用FindKey/FindNearest来查找一条或多条符合条件的数据,当然待查找的Field必须是一个IndexField。可以看出,这种基于Index的查找速度是非常快的。
procedure TForm1.FindKeyBtnClick(Sender:
TObject)
begin
Start
if ClientDataSet1.FindKey([SearchText]) then
begin
Done
StatusBar1.Panels[3].Text := SearchText +
' found at record ' +
IntToStr(ClientDataSet1.RecNo)
end
else
begin
Done
StatusBar1.Panels[3].Text :=
SearchText + ' not found'
end
end
procedure TForm1.FindNearestBtnClick(Sender: TObject)
begin
Start
ClientDataSet1.FindNearest([SearchText])
Done
StatusBar1.Panels[3].Text := 'The nearest match to ' +
SearchText + ' found at record ' +
IntToStr(ClientDataSet1.RecNo)
end
3.Going 定位
GotoKey/GotoNearest 与FindKey/FindNearest基本上没有什么区别。它也是基于Index的查找。唯一的区别就是在于你是怎么定义你的查找了。代码上也有区别:
ClientDataSet1.SetKey
ClientDataSet1.FieldByName(IndexFieldName).value := SearchText
ClientDataSet1.GotoKey
就相当于
ClientDataSet1.FindKey([SearchText])
要用好这两种基于Index的查找,还需要了解ClientDataSet和Index机制。这里就不详细说明Index机制。一个基本的原则,要有Index,才能查找。
4.Locating 查找数据
2,3两种查找方式都是基于Index的,但是在实际应用中,可能会查找IndexField以外的Field。那我们就可以使用Locate。但是查找速度是没有2,3两种快的。比如:如果你查找一条纪录9000/10000,Locate需要500ms,Scanning需要>2s,FindKey只要10ms(但是当你打开ClientData的时候,建立Index需要1s)。
procedure TForm1.LocateBtnClick(Sender:
TObject)
begin
Start
if ClientDataSet1.Locate('Field1,Field2..',VarArrayOf['value1,value2..'], []) then
begin
Done
StatusBar1.Panels[3].Text :=
'Match located at record ' +
IntToStr(ClientDataSet1.RecNo)
end
else
begin
Done
StatusBar1.Panels[3].Text := 'No match located'
end
end
小结:
ClientDataSet提供了好多种查找数据的方法。但是各自有其优缺点。
上面的例子中有Start和Done,如果你有兴趣,可以加入计时点进行速度测试。
Scanning最简单,但是最慢,因为比较慢,还得使用ClientDataSet.DisableControls和ClientDataSet.EnableControls方法(我在前面一片文章讲过)。
Findkey/FindNearest(GotoKey/GotoNearest)代码多,但是非常快。必须使用Index,不同的是Find需要的Index是必须建立好的,而Goto可以在第一次使用时建立Index。
Locate使用最方便,不需要Index,但是速度没有Find快。 可以最好加分,谢谢
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)