• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi数据库处理

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
Delphi数据库处理 第一节 BDE、ADO、InterBase和dbExpress
    Delphi中处理数据库主要有两种方法,也就是BDEADO,从Delphi 6.0开始还加入了一种dbExpress方法。另外,Delphi还提供了专门处理Borland 公司自己的数据库产品InterBase 数据库的专门的方法。
    BDEBorland Databas Engine),Delphi中最古老的技术,从delphi 2.0加入BDE 技术以后,一直是Delphi处理数据库的事实上的标准。BDE 是一个基于驱动程序的体系结构,每一种数据格式或数据源都有一种驱动程序来驱动相近的数据源。BDE 可以很好的支持现在最流行的ODBC API方法,ODBC是一种C/C++ 应用程序编程接口(API ),无论是对任何一种客户/ 服务器关系型数据库管理系统(RDBMS ),还是最流行索引顺序访问方法(ISAM)数据库(JetFoxpro),都能很好的访问。
同时,由于BDE 的驱动程序主要直接来自于第三方开发商,所以,对于像Oracle这些非微软的数据库,执行效率上比较高。正是这些特点,使BDE 技术还是得到了很多数据库开发程序员的欢迎。
    ADO 技术是微软提出来的处理关系型数据库和非关系型数据库的新技术,它基于微软被称为OLE DB的数据访问模式,它是专门为了给大范围商业数据源提供访问而设计的,包括传统的关系型数据表、电子邮件系统、图形格式、Internet资源等。ADO 所需内存更少,更适合大流量和大事务量的网络计算机系统。
    ADO 顶层有三个对象:ConnectionCommandRecordset
    Connection用以指定数据源,建立和数据源的连接。
    Command 对象用以对数剧源执行指定的命令,可以接受SQL 语句,表和存储过程的名称,执行SQL 查询,更新数据,插入纪录等。
    Recordset 对象表示的是来自表或命令执行结果的记录全集,操纵来自提供者的几乎所有数据。
由于ADO 技术的迅速普及,从Delphi 5.0 开始,加入了ADO 技术的模块,并逐步成为Delphi数据库设计的主流。但是,和VBADODC 相比,它还是有所不同的,在数据绑定上,它更多的吸收了BDE 的特点,以做到和原来的程序兼容,同时,它又可以接受标准ADO 技术的各种属性和方法,在接受这些属性和方法时,它是和数据绑定控件脱离的,当然从某种意义上来说,这种方案提高了执行效率,给设计人员以更多的选择。
    dbExpress Delphi 6.0加入的最新的数据库模块,它不使用缓存,可以快速浏览大量的数据,但是,不使用缓存就不能更改,所以它的标准方式是只读的。它一个重要的特点是交叉平台,可以和Linux 数据库连接,速度相当快。
下面的讨论,将以ADO 技术为主线,最后再说明BDE dbExpress的应用方式。

第二节ADO 面板的主要组件
    ADO 面板一共有7 个组件:

    ADOConnection: 主要用于建立数据库的连接;
    ADOdataSetADO 提取和操作数据库的主要数据集,可以直接连接到数据库,也可以通过 ADOConnection连接到数据库。
    ADOtable:主要用以操作和提取单个基表的数据,可以直接连接到数据库,也可以通过 ADOConnection连接到数据库。
    ADOquery:通过SQL 语言提取数据,其连接数据库的方式和前两种一样。
    ADOStoredProc这个组件专门用于运行数据库中的存储过程。
    ADOCommand:该组件用于运行一些SQL 命令,这个组件可以和支持数据集的组件一起使用,也可以直接从一个基表中提取一个数据集。
    RDSConnection一个进程或一台计算机传递到另一个进程或计算机的数据集合。
为了连接数据绑定控件,上述组件往往要和处于Data Access 中的Datasource配合使用。
可以看出,和VBADODC 不同的,Delphi中解决同一个问题提供了多种方案,看起来似乎增加了麻烦,但是却可以给程序员更大的自由空间,便于设计出高效率的数据库程序来。
下面通过几个例子来说明ADO 控件的用法。

第三节 ADOtable组件
    ADOtableADOdataSetADOqueryADOStoredProc都继承同一个父类TCustomADODataSet,所以,在属性事件和方法上有很多相似的地方,但它主要是针对数据库中的表进行操作。

    ADO -ADOtable
属性:
    Name='控件名'
    ConnectionString='连接字符串'
可以通过点击右边的按钮,通过向导建立数据源。有时候需要知道相对路径,可以用下面的方法找到程序当前的路径:

    tpath:=ExtractFilepath(Application.Exename);

文件名:=Tpath+'..\data\Test.mdb'

表明数据库在当前程序上一层的Data文件夹下。

    TableName='表名'
    Active=true

这就激活了数据源,为了和绑定控件联系,要增加一个DadaSource控件。事实上,所有的绑定控件都是和DadaSource联系

    Data Access-DadaSource
属性:
    Dataset=ADOtable.Name

加入绑定控件:
    Data Controls-

    DBgrid(表格)
属性
    DadaSource='DadaSource.Name'

    DBNavigator(导航条)
属性
    DadaSource='DadaSource.Name'

运行一下可以看出关系

下面介绍一下ADOtable的一些重要的方法,这些方法大部分和Table是兼容的。
为了便于叙述,ADOtable控件的Name定为 ADOtable1

   1)移动指针
第一个:   ADotable1.First;
最后一个: ADotable1.Last;
下一个:   ADotable1.Next;
前一个:   ADotable1.Prior;

   2)从字段中取出数据
通过如下方法可以访问字段的值

       ADOtable1.FieldValues['字段名']
       ADOtable1.Field[索引值]

在读写字段的时候,又是根据需要可以加上强制类型转换
例如:
       Edit1.text:=ADOtable1.Field[0].AsString;

用下面的方法可以去除字段的性质:

       ADOtable1.fielddefs[索引值].name;     字段名
       ADOtable1.fielddefs[索引值].Size;     字段大小
       ADOtable1.fielddefs[索引值].Datatype; 字段属性

    3)修改数据:
修改数据的时候,需要先建立EDIT方法,然后用Post方法才能真正的写入。

   ADOtable1.edit;
   ADOtable1.FieldValues['姓名']:='王秀琴';
   ADOtable1.post;

    4)增加一条空纪录: ADOtable1.append;

新增纪录也可以用如下方法,在新增纪录的同时输入数据

       ADOtable1.appendRecord(xxx,xxx,xxx,....)
    5)删除当前纪录:ADOtable1.delete;
如果在ADOtable1OnBeforeDelete方法中写下:
       if messagedlg('确实要删除吗?',mtinformation,[mbyes,mbno],
          0)=mrno then abort();
可以实现删除前的提示。

    6)过滤
可以用如下的方法实现数据的过滤

ADOtable1OnFilterRecord方法中写下:
      Accept:=(条件);

然后

    ADOtable1.filtered:=true; 为实现过滤。
    ADOtable1.filtered:=false; 为解除过滤。

    7)指针在文件的头尾

指针在最后一条记录之后 ADOtable1.Eof
指针在第一条记录之前    ADOtable1.Bof

如此可以实现对数据库的遍历

    form1.ADOtable1.first;
    while not form1.ADOtable1.eof do
        Begin
            .......    
           form1.ADOtable1.next;
        End;

    8)此外, ADOtable组件还继承了ADO 中的RecordSet对象几乎全部属性和方法,简述如下:

with adoTable1.Recordset do
begin

   //属性
   PageSize                     一页所包含的记录数
   PageCount                    数据的页数
   AbsolutePage;                当前记录所在页
   AbsolutePosition;            当前记录的序号位置
   BOF;                         指针在第一个记录之前
   EOF;                         指针在最后一个记录之后

   //方法
   AddNew fieldList,Values;     创建新记录,其中fieldList为用数
组表示的字段名集,Values为用数组表
示的数据集。
   Cancel;                      取消上一步所作的修改
   Update Fields,Values;        保存对当前记录所作的修改
   Delete;                      删除当前记录
   Move(n);                     移动n 条记录
   MoveFirst;                   移动到第一条纪录
   MoveLast;                    移动到最后一条纪录
   MoveNext                     移动到下一条纪录
   MovePrevious                 移动到上一条纪录
   Requery;                     通过从新执行对象所基于的查询,以
更新RecordSet 对象中的数据。
end;

使用Recordset 对象来处理数据集的数据,会发现数据帮定控件的指针一般不会跟着移动,这实际上给设计者提供了另一个在后台快速处理数据的方法。

附录:关于TActionList控件的使用
Standard面板,提供了一个TActionList 控件,它集中了大部分按钮的使用方法,可以简化按钮的设计。
方法:
调入TActionList,双击,可以看到一个面板,右键 -New Standard Action 选择 Datasat下的适当的控制,可以选择多个。
以后加入的开关,只要在属性Action 中选择适当的项目就可以了,不需要专门编程,实例见“ActionList应用

第四节 ADOQuery组件
ADOtable组件一样,ADOquery继承了同一个父类TCustomADODataSet,所以,上面说到的ADOtable属性事件和方法基本上是通用的,但它主要是针对数据库中的SQL 命令进行操作。
下面主要说一下ADOquery特殊的地方。

    1SQL 属性
    SQL TStrings类型的属性,包含了ADOquery组件要执行的SQL 命令,是ADOquery最为重要的属性之一。
在应用程序中,需要调用Open方法或者ExecSQL 方法来执行在SQL 中的命令。在设计阶段,可以利用属性编辑起来编写。
例如:
    Width ADOquery do 
      Begin
        //重新写入时,要关闭原来的查询
       Close;
       width SQL do
         Begin
          //因为Add是在原来的基础上加入,所以先清除原来的SQL命令
           Clear;
           Add('selsct 编号,姓名,奖金')
           Add('From 奖金表')
         End;
        //执行SQL 命令
       Open; 
      End;
查询命令也可以这样来写:

 s1:='编号';
 s2:='姓名';
 s3:='金额';
 with ADOquery1 do
    begin
       sql.Clear;
       SQL.Add('select ');
       SQL.Add(s1+','+s2+','+s3);
       SQL.Add(' From 奖金 ');
       execsql;
       active:=true;
    end;

效果是一样的。

第五节 ADOConnection 和 ADODataSet

虽然ADOTableADOQuery组件可以非常简单的连接数据库,但是当需要更加精细的控制数据库的时候,往往需要应用ADO 更多的方法,我们知道,支撑ADO 的主要由ConnectionCommandRecordsrt三个对象组成,对应的就有ADOConnectionADOCommand控件,而Recordsrt对象属性和方法,封装在ADODataSet中,同时ADODataSet本身,也具备和ADOtable组件相同的对数据绑定控件控值的属性和方法。
这就大大提高了对数据库的控制能力。
ADO 顶层有三个对象中Connection处在最顶层,用以指定数据源,建立和数据源的连接。所以,ADOConnection必须和其它的数据控件连接才有效,最常用的就是和ADODataSet配合。
下面首先介绍连接方法,然后再讨论其它的问题

    1ADOConnection的加入和连接

加入ADOConnection
属性:ConnectionString='连接字符串'

加入ADODataSat
属性:Connection='ADOConnection1' ..... (ADOConnection,Name)
          CommandType=cmdtable   ...使用表连接
          CommandText 根据上面的选择,或选择表,或出现SQL 编辑框。
          Active=True 激活。
加入DataSource
属性:Dataset=ADODataSat 完成连接,再连接数据绑定控件。

     2ADOConnection的重要属性和方法

属性:

     a).Attributes
设置连接的数据库自动处理事务的能力
            xCommitRetaining:提交一个事务后自动开始一个新事务
            xAbortRetaining :回退一个事务的同时开始一个新事务

     b).Connected
标识和数据库的连接受否处于激活(True

方法:

     c).Open(UserID,PassWord)
打开一个连接(可以提供用户名和密码)

     d).Cancel
关闭数据库的连接

     e).Close
释放所有的系统关联资源

     f).Execute 执行一个SQL 命令。
完整的表述是

      Execute(SQL命令,该命令设计的记录数目,Option)

其中,Option的值如下

     eoAsyncExecute             异步执行指定的命令
     eoAsyncFetch    给定Cache属性的值后,再异步的取得数据
     eoAsyncFetchNonBlocking   非阻塞式线程执行
     eoExecuteNoRecords        没有返回纪录

     g).GetProcedureNames(List:Tstring);

获取数据库服务器上的存储过程名称,过程名保留在List参数中。
     f).GetTableNames(List:Tstring;SystemTables:Boolean=False)

获取数据库的数据表,表名存放在List参数中,SystemTables指示是否获取数据库系统表的名称,系统表是关于数据库类型定义和用户信息的数据表,是数据库本身自动产生的。在特殊的设计中,这个表格可能会有用。

   3ADODataSet的属性和方法
我们在ADOTable中讨论的属性和方法,几乎都可以在ADODataSet中得到应用,但还有几个特殊的属性:


   CommandType



主要用于控制CommandText属性的状态,其中:



            cmdtable   ...CommandText使用表名连接

(内部是做了SQL 对各列的查询);

            cmdTableDirect ...CommandText使用表名连接

(内部不做SQL ,而是真正的表名连接);

            cmdtext   ....使用SQL命令文本;

            cmdfile   ....CommandType属性值作为持久的文件名;

            cmdStoredProc...CommandType属性值作为存储过程名称

来计算;

            cmdUnKnown ....不知道(默认为SQL



   CommandText

根据CommandType的设置,向提供者发出表名SQL 命令。



第六节 TADOCommand对象

ADO 的层次结构中,Command对象和RecordSet是处在同一层上,它主要用来对数剧源执行指定的命令,比如SQL 语句,表和存储过程的名称、更新数据,插入纪录等。虽然其它的控件也能执行这些方法,但需要遇到需要用Command 本身的属性和方法来控制数据源的时候,利用这个对象将是十分方便的事情。

主要属性:

      CommandType

      CommandText

      Cancel

和上面介绍的相同



      Assign(Source:Tpersistent)



把另一个ADOCommand 组件的所有属性复制到当前的ADOCommand组件中,调用的时候按名存取组件对象。



下面的例子可以看到ADOConnectionTADOCommandADODataSetDataSource和其它数据绑定控件是如何作用的。

放入控件

    ADOConnection

    TADOCommand

    ADODataSet

    DataSource

    Memo

    DBgrid

    Button



属性(注意一下TADOCommand1ADODataSet1的关系是平等的):



    ADOConnection1---ConnctionString=连接字符串

    TADOCommand1-----Connection=ADOConnection1

                     commandType=cmdText

    ADODataSet1 -----Connection=ADOConnection1

                     commandType=cmdText

    DataSource1 -----DataSet=ADODataSet1

    Memo1 -----------List=

    DBgrid1----------DataSource=DataSource1

    Button1Click事件过程



procedure TForm1.Button1Click(Sender: TObject);

var str1,str2:string;

begin



//取出输入的SQL 语言



   str1:=trim(Memo1.text);



//由于执行SQL语言时,除了select ,其它诸如Insert,Delete,Update都需要事先关闭数

//据集,所以下面把前六个字符取出来作为判断的依据。



   str2:=copy(str1,0,6);

   ADOCommand1.CommandText:=str1; //ADOCommand1执行命令



//检查用户是否送入的是select语句



   if str2='select' then

        begin

         ADODataset1.Recordset:=ADOCommand1.Execute;

         ADODataset1.Open;

         

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
delphi中Ihtmldocument2接口的使用发布时间:2022-07-18
下一篇:
Delphi中自定义异常及异常处理的一般方法发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap