Delphi使用ADO进行数据库编程

  • 格式:pdf
  • 大小:288.36 KB
  • 文档页数:6

Delphi使⽤ADO进⾏数据库编程

Delphi是⼀个可视化的编程⼯具,ADO编程也是这样,所以话不多⾔,直接通过代码、截图和语⾔来说明。

我的数据库是Oracle,为了测试,先建⼀个表:create table practice(uno varchar(8), uname varchar(20)); 这个表⽐较简单,只有两个

字段。

我的Oracle数据库是安装在虚拟机上的(操作系统是Redhat),所以需要先在服务器上配置好,另外需要在Windows上进⾏相关的配

置(监听程序配置和本地⽹络服务名配置)。否则后⾯就没有办法配置数据源……来连接数据库。具体怎么进⾏配置请⾃⼰上⽹搜索查询。 然后我们来做⼀个简单的增删改查的⼩⼯具。

1.新建⼀个项⽬,上⾯放好需要控件

如下图,其中最为重要的⼀个控件是⽤红框框起来的控件:TADOConnection

注意需要引⼊DB、ADODB这两个单元。

2.双击TADOConnection控件进⾏配置

双击TADOConnection打开

点击Build..按钮,先选择数据库驱动,我选择的是最后⼀个

像我使⽤的是Oracle数据库,所以需要选择Oracle的数据库驱动,这⾥⾯提供的Oracle数据库驱动有两种(Oracle⾃⼰的驱动还有微软

提供的Oracle驱动),如下图⽤红框标记的 点击下⼀步,配置数据源,⽤户名密码等信息,选择允许保存密码,点击确定

然后点击OK即可进⾏ 下⼀步的编程⼯作

3.然后实增删改查的功能

⾸先是在响应窗体创建事件的函数中打开TADOConnection对象con1

procedure TForm1.FormCreate(Sender: TObject);

begin

con1.Open;

end;

这⾥不需要调⽤con1.Create,因为通过将控件直接拖拽到窗体上的⽅式,会在窗体创建的时候也创建这些控件,如果这⾥在Create就

会重复创建,重复创建就会出错。

接着是实现 “增” 的功能双击设计⾯板上的按钮,编写按钮响应OnClick的⽅法

procedure TForm1.btn1Click(Sender: TObject);

var

adoQuery: TADOQuery;

count: Integer;

begin

adoQuery := TADOQuery.Create(nil);

adoQuery.Connection := con1;

adoQuery.SQL.Text := 'INSERT INTO practice VALUES(''' + edt1.Text + ''', ''' + edt2.Text + ''')';

count:= adoQuery.ExecSQL;

if(count>0) then

ShowMessage('成功插⼊' +IntToStr(count) + ' 条数据');

adoQuery.Free;

end;

注意其中的代码的⼀些细节。 将adoQuery的Connection属性设置为con1。

拼接SQL的时候,注意两个单引号 ''的使⽤规范。

对于往数据库中写数据的SQL,需要使⽤ExecSQL⽅法,insert、delete、update这样的写数据库的⽅法,需要调⽤ExecSQL⽅

法,ExecSQL⽅法的返回值是这条SQL影响了数据库中的⼏条记录(⽐如:插⼊了⼏条记录、删除了⼏条记录、修改了⼏条记录),所以这

个⽅法中会⽤到ExecSQL的返回值。

最后不要忘了释放adoQuery对象。保证不会出现内存泄露,因为如果不释放,那么每次点击按钮就会创建⼀个adoQuery对象。不过这

样使⽤局部变量也不是很好,可以使⽤TADDOQuery创建⼀个全局变量,在程序打开的时候创建好,做好Connection属性的赋值,然后使

⽤,最后使⽤完成在程序关闭的时候再释放,这样就可以防⽌每次点击按钮都要创建,不过使⽤TADOQuery全局变量也要有⼀些规范,参

见下⾯的总结说明!

补充说明TADOQuery

要想执⾏SQL需要创建TADOQuery对象。我们可以将AdoQuery作为⼀个局部变量,然后这个⼩demo中需要实现的增删改查每个都创

建⾃⼰的TADOQuery局部变量,执⾏完之后再Free,当然也可以创建全局变量,然后每个操作都使⽤这个全局变量。

但是如果使⽤全局变量的话,特别需要注意⼀点。在原来的使⽤TADOQuery局部变量的时候,每个操作之前先创建⼀个TADOQuery对

象,然后将其Connection属性赋值为那个TADOConnection的变量,然后给SQL.Text赋值,然后就可以Open或者ExecSQL执⾏了,最后在

程序结束的时候在进⾏Free即可。

但是如果使⽤TADOQuery全局变量的话,⾸先是Create好TADOQuery,然后给它的Connection赋好值,然后每个操作的时候,直接将

其SQL.Text赋值,然后执⾏就好了。不过在这个过程中必须注意在给SQL.Text赋值之前需要执⾏TADOQuery的Close⽅法,然后再

SQL.Clear,然后再赋值SQL,然后再执⾏。

begin

adoquery.close;

adoquery.SQL.clear;

adoquery.SQL.add('...');

adoquery.open; //如果是写操作的话就是adoquery.ExecSQL;

end;

这是⼀个经典的语句,在每次查询之前先把上次删除给关了。 如果不关,第⼀次查询是没问题的,可如果adoqury1再⽤⼀次的话,就

会有可能和上次发⽣冲突。 程序的不确定性很强,所以这样做是有必要的,防⽌出现意想不到的问题。

Close还是需要。还有⼀点就是节约内存,⽤过就关,不然会⼀直呆在内存⾥⾯!!所以不管是使⽤adoquery.SQL.Text 还是

adoquery.SQL.Add(),如果是全局变量的话,还是要使⽤Close⽅法。

Clear看情况决定要不要。不过如果是直接给adoquery.SQL.Text赋值的话,可以不⽤执⾏adoquery.SQL.Clear因为新赋的值将会覆盖原

来的值。但是如果是使⽤adoquery.SQL.Add()的话,是在原来的SQL基础上追加,所以可能需要Clear原来的SQL,再添加新的SQL,保证

可以不和上次冲突!

再补充说明adoquery.SQL.Add和adoquery.SQL.Text的区别

//adoquery1.sql.add相当于添加⼀个值⽐如说

adoquery1.sql.text:='a';

adoquery1.sql.add('b');

//那么就相当于直接

adoquery1.sql.text='ab';

adoquery1.sql.text 就是说写⼀⾏完整的查询语句放在SQl的查询⾥。当在delphi中SQL语句太长,我们可以把adoquery1.sql.text 分开由

多个adoquery1.sql.add()来分段写。

adoquery1.sql.add()主要起追加的作⽤。

接着实现 “查” 的功能,同样编写按钮响应OnClick的⽅法

procedure TForm1.btn2Click(Sender: TObject);

var

adoQuery: TADOQuery;

begin

adoQuery := TADOQuery.Create(nil);

adoQuery.Connection := con1;

adoQuery.SQL.Text := 'SELECT * FROM practice WHERE uno = ''' + edt3.Text + '''';

adoQuery.Open;

adoQuery.First;

while not adoQuery.Eof do

begin

ShowMessage(adoQuery.fieldByName('uno').AsString + ': ' + adoQuery.fieldByName('uname').AsString);

adoQuery.Next;

end; adoQuery.Free;

end;

执⾏Select的SQL,需要使⽤Open,⽽不是ExecSQL⽅法。

通过判断Eof来进⾏循环展⽰搜索到的数据库中的符合条件的记录。判断是否Eof,注意Eof为True并不是指向了最后⼀条记录的时候,

⽽是指向了最后⼀条记录之后,再Next时Eof才是True。

First是定位到所有搜索到的记录的第⼀条。Next是指向下⼀条。

根据字段名称获取每条记录的对应信息,注意这⾥⾯使⽤FieldByName获取字段对应的值的⽅法。因为前⾯是使⽤的select * from,所

以可以既获得'uno',有可以获得'uname',假如⽤select uname from 的话,就只能使⽤fieldByName获得'uname',不能获得'uno',所以使⽤

fieldByName时候需要注意select语句搜索了哪⼏项。

接下来讲解删除功能的代码

procedure TForm1.btn3Click(Sender: TObject);

var

adoQuery: TADOQuery;

count: Integer;

begin

adoQuery := TADOQuery.Create(nil);

adoQuery.Connection := con1;

adoQuery.SQL.Text := 'DELETE FROM practice WHERE uno = ''' + edt4.Text + '''';

count:= adoQuery.ExecSQL;

if count>0 then

ShowMessage('删除' + IntToStr(count) + ' 条数据')

else

ShowMessage('没有删除数据');

adoQuery.Free;

end;

最后是改数据库数据的功能代码

procedure TForm1.btn4Click(Sender: TObject);

var

adoquery: TADOQuery;

count: Integer;

begin

adoQuery := TADOQuery.Create(nil);

adoQuery.Connection := con1;

adoquery.SQL.Text:= 'UPDATE practice SET uname = ''' + edt6.Text + '''WHERE uno = ''' + edt5.Text + '''';

count:= adoquery.ExecSQL;

ShowMessage('修改了' + IntToStr(count) + ' 条记录');

adoQuery.Free;

end;

最后的代码是

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, DB, ADODB;