丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

第1章             ADOQuery组件执行SQL命令

数据库是一个存储大量信息的格式文件,当我们使用ADOTable组件来连接数据库时,操作的对象是整个表,不管表内的数据是否是所需要的,每一笔数据都被抓进来,用户所得的数据都是未经“筛选”的。

要在众多的数据中找到所需的信息,使用SQL命令是一个普遍而又事半功倍的方法。

1.1             SQL命令与ADOQuery组件

1.1.1          ADOQuery组件

前面一直使用的ADOTable组件,只能使用“字段编辑器”来决定使用的字段是哪些,无法对数据库下达SQL命令。要连接数据库,又能对数据库下达SQL命令,就必须使用ADOQuery组件,其位置在ADO组件页:

 

41  ADOQuery组件

 

ADOQuery组件与ADOTable组件一样,都是使用ConnectionString属性来设置连接数据库,但是,ADOQuery组件没有TableName属性来设置使用哪一个表,它是通过SQL属性设置来决定要从数据库中取回什么数据。但必须注意:在设置SQL属性之前,不可以将ADOQuery组件的Active属性设置为True,否则就会出现如下错误信息:

 

42  ADOQuery组件失去SQL属性时的错误停息

 

1.1.2          执行SQL命令

现在我们来使用SQL命令取出数据库内的数据。

41利用ADOQuery组件执行固定的SQL命令。

在窗体中布置3个组件:ADOQueryDataSourceDBGrid,如所示:

按照下表设置各组件的属性及参数:

构件

属性

属性值

ADOQuery1

ConnectionString

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Delphi数据库程序设计\教材例子(光盘)\CH01\STUDENTS.mdb;Persist Security Info=False

DataSource1

DataSet

ADOQuery1

DBGrid1

DataSource

DataSource1

 

 

43  设置ADOQuery组件的SQL属性

 

接着,选中ADOQuery1,单击“Object Inspector”窗口中SQL属性右侧的三个点的按钮,打开“String List Editor”对话框,在此对话框中输入:

Select 姓名,家长  from  Students

 

然后单击OK按钮返回。

最后,在命令按钮Command1OnClick事件中添加如下事件处理程序:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

ADOQuery1.Open; //或者改为 ADOQuery1.Active:=true

end;

 

运行程序,就可看到如 44所示结果:

 

44  程序运行结果

除了在设计时通过“String List Editor 写入SQL命令之外,也可以在运行时通过执行如下程序来写入:

 

ADOQuery1.SQL.Add( <SQL命令> )

 

1.2             执行动态SQL命令

 

41那样,预先将SQL语句写死在ADOQuerySQL属性中,那么从数据库取的数据就固定了,无法进行不同的查询工作,这样的SQL语句称为静态SQL语句。

静态SQL语句在实际开发应用中用得很少,相反更多的则是动态SQL语句,它是在SQL语句中包含一系列参数,在程序运行过程中各参数值是可变的,即:可以动态地给SQL语句中的参数赋值。

 

1.2.1          SQL语句中使用参数

 

下面通过一个例子来说明如何在SQL语句中使用参数,并使用ADOQuery组件执行带参数的查询。

42查询Employee数据库中各县市的员工名单。

步骤:

1)、创建如下界面

 

45  ADOQuery组件执行带参数的查询

2)、设置主要构件的属性:

构件

属性

属性值

ADOQuery1

ConnectionString

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Delphi数据库程序设计\教材例子(光盘)\CH04\Employee.mdb;Persist Security Info=False

DataSource1

DataSet

ADOQuery1

DBGrid1

DataSource

DataSource1

 

3)、编写命令Button1OnClick事件处理程序:

procedure TForm1.Button1Click(Sender: TObject);

begin

  With ADOQuery1 do

  begin

    SQL.Clear;

    SQL.Add('select * from Employee where 县市=:XianShi');

    Parameters[0].Value:=edit1.Text;

    Open;

  end;

end;

 

 

注意

 

 


在执行SQL.Add(  )之前,必须先执行SQL.Clear,将SQL对象中先前的SQL命令清除,否则在重复执行SQL.Add(  )时就会出错!

 

4)、运行程序:在编辑框中输入“桃园县”,执行查询看到如下结果:

 

 

46  带参数查询的运行结果

 

上述例子中的SQL语句的Where条件中出现了:

 

 县市=:XianShi

 

其中的“XianShi”就是一个参数,名称由用户自定,但参数之前必须加上冒号,而且必须紧跟在参数之前,中间不能有空格!

SQL语句中引入参数之后,在执行SQL语句之前就必须给参数赋值。如何赋值呢?这就要用到ADOQuery组件的Parameters属性。该属性是一个下标从0开始的数组:

 

Parameters[0]Parameters[1]Parameters[2]、…、

 

其中的每个数组元素与ADOQuery组件的SQL语句中的参数相对应,例如要给SQL语句中的第一个参数赋值,可以执行如下语句:

 

ADOQuery1.Parameters[0].Value:=<参数值>

 

要给SQL语句中的第二个参数赋值,可以执行如下语句:

 

ADOQuery1.Parameters[1].Value:=<参数值>

 

以此类推

 

除了用Parameters[0].Value Parameters[1].Value 等来给SQL语句中的参数赋值外,还可以使用如下语句:

 

Parameters.ParamByName(<参数名>).Value:=<参数值>

 

来给参数赋值。例如,42中的Parameters[0].Value:=edit1.Text;可以改为:

 

Parameters.ParamByName(‘XianShi’).Value:=edit1.Text;

 

很明显,后一种方式比前一种更直观一些。

 

1.2.2          SQL命令中带有多个参数的情形

 

SQL命令中可以带有多个参数,例如:某个Query组件,为它编写如下的动态SQL语句:

 

Insert Into Customer(CustNoNameCountry)  Values(CustNo ,:Name ,:Country)

 

对于上述这条动态SQL语句中的三个参数,可以利用QueryParams属性为参数赋值:

Query.Params[0].AsString:=”1998” ;

Query.Params[1].AsString:=”AAA”  ;

Query.Params[2].AsString:=”China”;

 

上述语句将把“1998”赋给参数CustNo,“AAA”赋给参数Name,“China”赋给参数Country

 

1.2.3          调用ADOQueryExecSQL方法

 

有些SQL命令执行后并不象Select命令那样返回一个结果集,如:INSERT UPDATEDELETECREATE TABLE等。执行这些SQL时就不能用Open方法,而必须使用ExecSQL方法;反之,对于Select命令,则必须使用Open方法,否则得不到查询结果。

 

课外练习:

1、              利用ADOQuery组件,在Northwind数据库中执行下列查询:

(1)、查询各员工的销售总额。

(2)、           查询哪些员工的销售额超过平均销售额。

(3)、           查询各年度销售总额

(4)、           查询销售额最高的前三名员工。

(5)、               查询1998年度“北风贸易公司”需要支付给各运货商的运费。

 

2、              创建一个UserInfo.mdb数据库,其中包含一张“用户”表,表结构如下:

字段名

类型

字段宽度

UserName

文本

50

Password

文本

50

 

 

 


然后创建如下图所示的用户登录窗体,如果登录成功则关闭窗体,否则显示一个“口令错误!”的信息框。

 

 

 

 

 

posted on 2007-07-21 15:12  丁保国  阅读(2098)  评论(3编辑  收藏  举报