delphi ADO连数据库学习实例(初级+高级)

delphi ado 连数据库------初级

1.在窗体上添加ADOConnection,ADOTable,DataSource控件各一个
2.把ADOTable关联到ADOConnection,把DataSource关联到ADOTable
3.双击ADOConnection控件的ConnectionString属性,在弹出的对话框中选择数据提供器,如果是Access就选Jet4.0,是SQL Server就选SQL Server Provider
4.点击下一步(英文版是Next),选择要连接的数据库,如果是SQL Server,Oracle等需要提供正确的用户名和密码
5.点击测试连接,成功后关闭对话框
6.把ADOConnection的Active属性设为True
7.在窗体上放置一个DBGrid控件
8.把DBGrid关联到DataSource上
9.运行程序,就能看到数据显示出来了
10.如果要操作数据,就再添加一个DBNavigator控件,也要关联到DataSource

整个过程不需要编写任何代码,直接拖放控件,设定属性即可

=================================

 

delphi ado 连数据库-----高级

 

ADO是Microsoft存取通用数据源的标准引擎。ADO通过封装OLE DB而能够存取不同类型的数据,让应用程序能很方便地通过统一的接口处理各种数据库。ADO由一组COM对象组成,每一个不同的原生ADO对象负责不同的工作。下面,向大家介绍如何使用原生ADO对象的动态属性来实现ADO的高级功能。www.sq120.com推荐文章

  ADO原生对象关系图:
  Connection
  Errors→Error
  Command→Parameters→Parameter
  RecordSet→Fields→Field
一、存取原生ADO对象
  Delphi中的ADO组件页中的组件为我们通过ADO技术访问数据库提供了方便。这些组件封装了原生的ADO对象。虽然我们利用ADO组件页中的组件也能编写出有效率的数据库程序,但是ADO中的一些属性和方法仍然是ADOExpress组件没有封装进去的,而此时,需要使用这些没有封装的属性和方法,必须还得通过存取原生的ADO对象来使用这些属性和方法。
  在ADO组件中,每个组件都有一个属性让程序员通过它来存取它所封装的原生ADO对象。下面我们用表1来说明ADO组件页中ADO组件封装原生ADO对象的属性:
  在程序中访问ADO组件封装的原生ADO对象,例如:
  Var
  MyRS :_RecordSet;
  MyRS :=ADODataSet1.RecordSet;
  以上这句就是访问组件封装的原生ADO对象RecordSet。


 
二、存取原生ADO对象的动态属性
  当我们用ADO组件编写针对特定数据库的应用程序时,ADO驱动程序会将特定数据库所能提供的功能存储在动态属性之中。在ADO模型中,每一个原生AD
  O对象都有一组动态属性。
  注意:在Delphi中,只能通过原生的ADO对象来存取动态属性。
  原生的ADO对象的动态属性集合存储在名为Properties的数组结构中,Properties数组中的每一个数组元素Property就对应一个特定的动态属性。因此,访问原生ADO对象的动态属性的基本步骤是:
  1. 通过ADO组件的属性访问其封装的原生的ADO对象;
  2. 利用原生的ADO对象访问其Properties动态属性集合;
  3. 在Properties动态属性集合中访问Property动态属性;
  4. 存取Property动态属性的值,实现ADO组件未封装的功能。
  Delphi为我们访问动态属性集合Properties提供了几个方便的接口函数供我们调用:
  Function Get_Item(Index : OleV
  ariant) :Property; SafeCall;//根据动态属性的索引值或名称获取动态属性
  Property Item[Index :OleVariant
  ] :Property Read Get_Item;//根据动态属性在集合中的索引值来获取动态属性
  Delphi也提供了以下的属性来方便地访问动态属性Propery的名称和值:
  Name 动态属性的名称
  Value 动态属性的值
  为了说明这些原理,我们用一个简单的例子来说明。这个例子中,程序运行后点击按钮,在Memo中就会显示原生的ADO对象RecordSet的所有动态属性。
  1. 建立一个新的工程,保存为Project1.dpr;
  2. 在主窗体上放置如下组件:
  TAdoConnection、TAdDataSet、TMemo、TButton
  3. 将TAdoConnection的Conne
  ctionString属性连接到SQL SERVE
  R 数据库的Pubs数据库;
  4. 设置TAdoDataSet的Connecti
  on属性为上一步中的TAdoConnecti
  on组件;
  5. 编写按钮的Button1Click事件处理函数代码如下:
  procedure TForm1.Button1Click(S
  ender: TObject);
  Var
  i :Integer;
  MyPty :Property_;
  MyPties :Properties;
  MyRS :_RecordSet;
  begin
  AdoDataSet1.Open;
  MyRS :=AdoDataSet1.RecordSet; //获取原生的ADO对象赋值给MyRS
  MyPties :=MyRS.Properties; //获取原生ADO对象的动态属性集合Prop
  erties赋值给MyPties
  For i :=0 to MyPties.Count-1 do //循环取得动态属性集合Properties中的每一个动态属性
  begin
  MyPty :=MyPties.Item[i]; //动态属性集合MyPites的Item属性根据索引值取得每一个动态属性赋值给MyPty
  Memo1.Lines.Add(MyPty.Name); //动态属性MyPty的Name属性表示该动态属性的名字,将动态属性的名字加入到Memo1列表中。
  end;
  end;

三、利用原生ADO对象实现ADO高级功能
  我们利用ADO编写的数据库应用程序,总会涉及到数据更新的情况。当利用ADO将数据更新回数据库时,ADO必须依据一定的条件从数据库中找到将要被更新的原始记录,然后用更新的字段值更新回数据库。ADO默认的更新条件是这样的,依据关键字段的值与被修改的字段的原始值在数据表中查找这样的记录,如果找到这条记录,则用更新的字段值更新回数据库。这个所依据的更新条件也是原生ADO对象的动态属性来控制的,我们可以在程序运行中存取这个动态属性,达到修改更新条件的目的。控制更新条件的动态属性是通过原生的ADO对象的RecordSet对象的UpdateCriteria动态属性来实现的。UpdateCriteria动态属性取值的意义,见表2。

 
  其中adCriteriaUpCols是ADO的默认设置。在一个多人使用的系统中,很可能同一笔数据在相同时间被不同的用户修改,这时较好的设置UpdateCriteria的值,能极大程度地控制是否能成功地将数据更新回数据。例如:一个表有A、B、C三个字段,A是关键字段。用户甲更新了一条记录的B字段值,而此时用户乙更新了同一条记录的B字段的值,假设此时UpdateCriteria动态属性的值为adCriteria
  Key,用户乙的修改结果就会把用户甲的修改所覆盖。如果UpdateCriteria动态属性的值为adCriteriaUpCols,此时,用户乙的修改就不会成功,因为对字段B的值在数据库找不到原始记录。
  为了说明这个原理,我们用一个简单的例子来说明。这个例子中,我们修改原生ADO对象RecordSet的Update
  Criteria动态属性的值(默认为adCriteriaUpCols)为adCriteri
  aKey,即把ADO的更新条件设置为依据关键字段的值在数据表中寻找原始记录(如图)。


 
  1. 新建一个工程,命名为Project1.dpr。
  2. 在主窗体中放置如下组件:
  TAdoConnection:连接到SQL SERVER数据库服务器。
  TAdoTable:设置其Connection属性为上一步中的TAd
  oConnection组件,并设置TableName为数据库中一个表名。
  TDataSource:设置其DataSet属性为上一步的TAd
  oTable组件。
  TDBNavigator 、TDBGr
  id:设置其DataSource属性为上一步的TDataSource组件。
  3. 在主窗体的OnCreate事件处理函数中编写代码,来修改原生ADO对象的Upd
  ateCriteria动态属性值为adCr
  iteriaKey,访问原生ADO对象的动态属性的步骤见前面所述。代码如下:
  procedure TForm1.FormCreate(Sender: TObject);
  Var
  MyPty :Property_;
  MyPties :Properties;
  MyRS :_RecordSet;
  begin
  AdoTable1.Open; //打开数据集
  MyRS :=AdoTable1.RecordSet; //获取TAdoTable组件封装的原生的ADO对象RecordSet
  MyPties :=MyRS.Properties; //通过原生ADO对象获取Properties动态属性集合
  MyPty :=MyPties.Get_Item('Update Criteria'); //通过动态属性集合的Get_Item函数获取其中的动态属性Upda
  teCriteria的Value值。
  MyPty.Value :=adCriteriaKey;
  //注意:在程序中引用adCriteriaKey常量,必须在Uses子句中包括ADOInt单元。
  //如果不想另外引用ADOInt单元,可以直接用adCriteriaKe
  y代表的值0作为属性值赋值。
  //AdoTable1.Recordset.Properties.Get_Item('Update Criteria'
  ).Value :=adCriteriaKey; 这一句的功能和上面各句是一样的。
  End;
  ADO比BDE功能有了很大的提高。ADO对多表连接的查询结果就具有修改的能力,而BDE不能对多表连接的查询结果进行修改更新的操作,而必须依靠TUpdateSql组件来实现这个功能。ADO能自动地判断被修改的字段所属的表,然后分别更新回不同的表中。但是在对表连接的查询结果作出删除操作时,ADO总会把两个表中的数据都删除掉。例如有一个员工表,一个定单表,将这两个表通过员工编号连接起来,作出删除操作时,同时会将员工表中的数据,与定单表中的数据删除掉,这也许是我们不希望看到的,假设我们只希望删除掉一个员工接到的其中一笔定单记录,而不愿意把这个员工的记录也删除掉,这个时候我们应该怎么办呢? 在ADO中的原生ADO对象的Unique Table动态属性负责控制这个功能,设置Unique Table的值为多表连接中某一个数据表的名称,就能实现在多表连接中删除指定表的记录。
  在这个例子中,我们通过原生ADO对象的动态属性Unique Table,实现在多表连接的结果集中,删除指定表中的记录。这里假设我们只希望在删除数据时,只删除DetailTable数据表中的记录,而希望保留MainTable表中的记录,步骤如下:
  1. 新建一个工程,命名为Project2.dpr。
  2. 在主窗体中放置如下的组件:
  TAdoConnection:连接到SQL SERVER的数据库
  TAdoDataSet:设置其Connection属性为上一步中的TAdoConnection组件,并设置其CommandText属性为两个表连接查询的SQL语句,比如:
  select a.EmpId, a.EmpName, a.EmpOffice, b.OrderId,b.OrderName from MainTable a join DetailTable b on a.Emp
  Id=b.EmpId
  TDataSource:设置其DataSet属性为上一步的TAdoDataSet组件。
  TDBNavigator 、TDBGrid:设置其DataSource属性为上一步的TDataSource组件。
  3. 在主窗体的OnCreate事件处理函数中编写代码:
  procedure TForm1.FormCreate(Sender: TObject);
  Var
  MyPty :Property_;
  MyPties :Properties;
  MyRS :_RecordSet;
  begin
  AdoTable1.Open; //打开数据集
  MyRS :=AdoDataSet1.RecordSet; //获取TAdoDataSet1组件封装的原生的ADO对象RecordSet
  MyPties :=MyRS.Properties; //通过原生ADO对象获取Properties动态属性集合
  MyPty :=MyPties.Get_Item('Unique Table').Value := 'Detail
  Table'; //通过动态属性集合的Get_Item函数获取其中的动态属性Unique Table的Value值。
  //AdoDataSet1.Recordset.Properties.Get_Item('Unique Table'
  ).Value := 'DetailTable'; 这一句的功能和上面各句是一样的。
  End;
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个使用ADO连接池的示例,演示了TADOStoredProc动态参数的使用,带重连机制 =================== unit UnitDemo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; //数据库服务器 gDBServer: String = '127.0.0.1'; //数据库名称 gDBName: String = 'master'; //数据库用户名 gDBUser: String = 'sa'; //密码 gDBPass: String = '2001'; implementation {$R *.dfm} uses ADODB, UnitADOConnectionPool; const CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+ 'as'#13#10+ 'select * from sysobjects where xtype=@type'#13#10+ 'return @@rowcount'; DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+ ' drop procedure TestMyPool'; var gPoolMan: TADOConnPoolMan = Nil; procedure TForm2.Button1Click(Sender: TObject); var ADOObject:TADOConnPoolObject; ADOStoredProc:TADOStoredProc; Running :Integer; I: Integer; begin //取得一个存储过程资源(含一数据库有效连接) ADOObject := gPoolMan.CreateSP('TestMyPool'); if ADOObject = Nil then //取得资源失败 Exit; try ADOStoredProc := ADOObject.ExecObject as TADOStoredProc; Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连 while Running>0 do begin Dec(Running); if ADOObject.NeedRefresh then begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连) if Not ADOObject.Reconnect then Exit; ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh; if ADOObject.NeedRefresh then Exit; end; for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do begin //========================= //传递参数 ADOStoredProc.Parameters.Items[I].Value := 'U'; //========================= end; if Running 0 then try //执行存储过程 ADOStoredProc.Open; //执行存储过程成功,退出循环进入后续的数据处理 break; except On E:Exception do begin //执行失败非程序级的异常通常有两种可能: //1.数据库连接断开 //2.自适合的参数传递当中可能存储过程已更新,参与不一致 //设置重连标志 ADOObject.NeedRefresh := True; //=================== //这里记录数据库操作失败日志 //=================== end; end; Exit; end; //========================== //从ADOStoredProc当中读取记录 ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value)); //========================== //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (****************BEGIN*******************) (*注:仅为测试准备 *) //初始化测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); ADOConn.Execute(CreateSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) //初始化连接池 gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true); end; procedure TForm2.FormDestroy(Sender: TObject); var ADOConn:TADOConnection; begin //释放连接池 if Assigned(gPoolMan) then gPoolMan.Free; (****************BEGIN*******************) (*注:仅为测试准备 *) //清理测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) end; end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值