Delphi中用ADO连接数据库

此文适合Delphi新手阅读,特别是连接数据库方面还一懂半懂甚至根本不懂的新手;

     --------------------------但总体显得有点乱-------------------------


     本文章以Delphi 7和SQL Server 2000为例,控件名均为系统默认,如Unit1,DataModule1,Edit1,ADOCommand1,ADODataSet1,ADOConnection1,DataSource1等等。



     初初接触Delphi时,想要连接数据库,但面对一大堆数据库类控件,无所适从,既不知该用哪个/些控件,也不知具体怎么连接数据库!

     经过一段时间的“摸爬滚打”,算是初步摸索到了常用的连接方法。其实主要是用ADO连接,而ADO也是最常用的连接技术之一。

     以下几个控件在连接数据库时是用得比较多的,并且通常的的连接架构是

————————————————————
             数据库
             ↑
         ADOConnection
         ↑       ↑
ADOCommand     ADODataSet
                   ↑
               DataSource
                   ↑
                 DBGrid
————————————————————

或者

————————————————————
         数   据   库
         ↑       ↑
   ADOCommand     ADODataSet
                     ↑
                 DataSource
                     ↑
                   DBGrid
————————————————————

     也就是说,ADOCommand和ADODataSet既可以通过ADOConnection连接数据库,也可以不用,分别直接连接数据库,因为这三个控件都有一个共同的ConnectionString属性。

     第一种比第二种更节省资源,因为当要使用多个ADOCommand、ADODataSet等控件时,使用第一种连接架构只需将所有这些控件的Connection属性设置(选择)为同一个ADOConnection,这样就只有一个ADOConnection控件与数据库打交道,毕竟连接数据库是一种比较大开销的资源,尽量节省可以提高运行速度。

     ConnectionString属性的设置很简单。选中要设置这一属性的控件后,再点击其ConnectionString属性框。如果熟悉的话可以直接在这里输入,但由于这一属性值比较长,所以通常的做法是构建,并且步骤也不多,一目了然:

     ·点击属性框后面的“...”小按钮,出现“连接源”对话框,选中“使用连接字符串”,再点击“构建...”按钮;
     ·首先选择“提供程序”。以连接SQL Server 2000 数据库为例,提供程序选择“Microsoft OLE DB Provider for SQL Server”;
     ·点击下一步;选择或输入服务器名框中,可以输入计算机名,也可使用计算机的IP地址,特别地,如果是单机使用的,可输入一个便于移植使用的IP地址,即指向本机的IP地址“127.0.0.1”;
     ·登录服务器信息,如果SQL Server 是集成登录的,选中“使用Windows NT 集成安全设置(W)”,然而多数情况下是选中“使用指定的用户名和密码”,并分别输入登录数据库的用户名和密码,通常是sa用户,而且如果是空密码的,可以选中下面的“空白密码”,至于“允许保存密码”,选不选就看个人喜好了;
     ·“在服务器上选择数据库”,选中所要连接的数据库;
     ·最后点击“测试连接”,通常会弹出“测试成功”的提示,确定即可。当然,前提是SQL 服务管理器已启动。

     ADOCommand适合执行无返回结果的SQL语句,如插入、删除、更新等;ADODataSet则用于执行有返回结果的SQL语句,如查询;两都都有一个共同的CommandText属性,用以设置其所要执行的SQL语句。

     通常所要执行的SQL语句不是固定不变的,而是在程序运行时根据用户的操作动态生成的。

     对于ADODataSet,可双击相应按钮(如“提交查询”),在其onClick事件中相应的SQL语句赋值语句,再将ADODataSet的CommandText属性设置为该字符串,最后改变ADODataSet的Active属性即可,如:

     sql:='select * from ....';       //其中sql为已定义的String类型变量
     ADODataSet1.Active:=false;
     ADODataSet1.CommandText:=sql;
     ADODataSet1.Active:=true;

     执行查询操作后,判断查询结果是否为空,如果非空,并且可以确定查询结果是唯一,则可分别直接引用查询结果的各个字段:

if (ADODataset1.FieldValues['字段名1']<>NULL) then
     //此处的“字段名1”为查询结果中的字段名,即数据库里相应表的字段名
begin
   Edit1.Text:=ADODataset1.FieldValues['字段名1'];
         //可引用查询结果,分别为各Edit控件的Text属性赋值,使之显示
   Edit2.Text:=ADODataset1.FieldValues['字段名2'];
   //等等
end

     而如果查询结果不唯一,也可逐一引用各字段,不过需要稍加修改。而此时最常用的是向下拉框Combobox控件中添加项目,并且通常放在窗体的onShow事件中执行:

______________________________________________________________________________

unit Unit1;       //当前窗体文件名

interface

uses
     //.....


type
     //……

     //...

procedure TForm1.FormShow(Sender: TObject);     //窗体的显示事件
var
     i,j:integer;                         //for循环变量只能是局部变量
     sql,item:String                           //字符串型
begin
//...

     sql:='select 字段1 from ....';       //通常是查询单个字段
     ADODataSet1.Active:=false;
     ADODataSet1.CommandText:=sql;
     ADODataSet1.Active:=true;

     j:=ADODataSet1.RecordCount;           //j和后面的i定义为整形变量
     ADODataSet1.First;                   //使指针指向(移动到)第一条记录
     Combobox1.Items.Clear;               //下拉框

     Combobox1.Items.Add('请选择...');       //添加一个提示项到下拉框项目中
     for i:=1 to j do                       //j为查询结果的记录数
     begin
       item:=ADODataSet1.FieldValues['字段1'];
                                           //逐一引用当前记录的指定字段值
       Combobox1.Items.Add(item);           //添加到下拉框项目中
       ADODataSet1.Next;                     //指针移动,指向下一条记录
     end;
     Combobox1.Text:='请选择...';             //显示提示值
     //...

end;

//...

end.
______________________________________________________________________________

     这样,在程序运行时打这个Form1窗体,该Combobox1下拉框的显示值就为“请选择...”,点击下拉框,其中就会有从数据库中查询出来的各个项目显示出来,以供用户选择。毕竟选择比输入快,而且如果输入的话,还要用户记住其内容,非常不方便。


     至于查询有多个返回结果并且查询多个字段的,可以用DBGrid控件以表格形式显示全部查询结果,不过此时需要添加一个DataSource控件,并且将将DBGrid的DataSource属性设置为该DataSource控件,再将该DataSource的DataSet属性设置为相应的ADODataSet控件,如上面的连接架构所示。

     对于ADOCommand,稍稍有点不同。因为它是通过Execute方法执行SQL语句的:

begin
     sql2:='insert into 表1 ......';     
                                     //可用于执行insert into,update,delete语句
     ADOCommand1.Execute;
     showmessage('操作成功。');       //操作完成后给出提示
end

   如果要使用的ADOCommand、ADODataSet等控件不多时,可以不用ADOConnection控件,直接使用ADODataSet和(或)ADOCommand控件,只需分别设置其ConnectionString属性;

     若要使用多个ADOCommand、ADODataSet等控件时,有一个办法可以节省使用控件的数量:

     建立一个DataModule窗体,假设窗体名为DataModule1,并将ADOConnection、ADOCommand、ADODataSet、DataSource等数据库控件建立在该DataModule1窗体中,然后在所有需要使用这些控件连接数据库的窗体中使用该DataModule1窗体。如果该DataModule1窗体名保存为Unit2文件,则在需要使用这些控件的Uses列表中加入Unit2即可,但在引用时需要在控件名前加上窗体名,如:

unit Unit3;       //当前窗体文件名

interface

uses
     //.....
     Unit2;       //引用DataModule1窗体的窗体文件名Unit2

type
     //……

     DataModule1.ADODataSet1.Active:=false;
     DataModule1.ADODataSet1.CommandText:=sql;
     DataModule1.ADODataSet1.Active:=true;
     //...
     Edit1.Text:=DataModule1.ADODataset1.FieldValues['字段名1'];
     //...
     DataModule1.ADOCommand1.Execute;

     也就是:如果所使用的控件不是在当前窗体的,而是通过使用窗体引用的,就需要在控件名前加上窗体名。

     或者可以这样省略窗体名:

     with DataModule1 do
       begin
         ADODataSet1.Active:=false;
         ADODataSet1.CommandText:=sql;
         ADODataSet1.Active:=true;
         //...
       end

 

 

1. 返回当前程序执行路径(EXE程序)   = ExtractFilePath(ParamStr(0))

2. 从ADOQuery里面取出数据

       while not Query1.eof do
        begin
            Query1.fieldbyname('字段名').asString;
           Query1.Next;
       End;

3. 快速插入数据
ADODataSet1: TADODataSet;

   ADODataSet1 := TADODataSet.Create(nil);
   ADODataSet1.Connection := ADOConnection1;
   ADODataSet1.CommandText := 'select * from OverQueue where id < 0';
   ADODataSet1.Open;
   ADODataSet1.Insert;
   ADODataSet1.FieldValues['service_id'] := 1;
   ADODataSet1.FieldValues['server_id'] := 1;
   ADODataSet1.FieldValues['remote']    := 'remote';
   ADODataSet1.FieldValues['local']     := 'rd.Local';
   ADODataSet1.FieldValues['size']      := '100';
   ADODataSet1.FieldValues['wtime']     := '2007-2-2 10:10:10';
   ADODataSet1.FieldValues['action']    := 0;
   ADODataSet1.FieldValues['level']     := 1;
   ADODataSet1.FieldValues['status']    := 2;
   ADODataSet1.FieldValues['end_time'] := TDateTime(now);
   ADODataSet1.FieldValues['remark']    := '';
   ADODataSet1.FieldValues['key']       := 'abcde';
   ADODataSet1.Post;
   ADODataSet1.Close;
   ADODataSet1.Free;

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值