首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

2.4  使用TSQLStoredProc控件

dbExpressTSQLStoredProc控件允许开发人员用来执行后端数据源之中定义的存储过程。使用TSQLStoredProc控件非常简单,只需要设定它的DBConnection属性值为一个TSQLConnection,再设定它的StoredProcName属性值为欲执行的存储过程即可。如果欲执行的存储过程需要传入参数,那么就只需要借助TSQLStoredProc控件的Params属性值传递参数给存储过程即可。现在就让我们使用一个实际的范例来展示如何使用TSQLStoredProc控件。

2-39是一个实现在InterBase之中的存储过程RAISESALARY。这个存储过程接受两个参数,第一个是员工的ID,第二个参数是欲加薪的百分比。RAISESALARY可以改变EMPLOYEE数据表中SALARY字段的数值,为特定的员工加薪,现在让我们看看如何使用TSQLStoredProc控件来调用它。

2-39  定义在InterBase中的RAISESALARY存储过程

CREATE PROCEDURE RAISESALARY (EID VARCHAR(10), RPERCENT FLOAT)

AS

begin

  /* Procedure Text */

  Update EMPLOYEE

  set

    SALARY = SALARY * (1 + :RPercent)

   where

    EID = :EID;

   suspend;

end

步骤建立数据模块和dbExpress控件

Delphi集成开发环境中点击File|New|VCL Forms Application建立一个新的Delphi应用程序。接着点击File|New|Others…|Data Module建立空白的数据模块。在数据模块中放入TSQLConnection控件,连接到范例InterBase数据库D2006HDBP.GDB,设定Connected属性值为True,再放入TSimpleDataSet控件,设定它的DBConnection属性值为刚才加入的TSQLConnection,再设定它的DataSet\CommandText属性值为select * from EMPLOYEE,设定Active属性值为True,从EMPLOYEE数据表中选取所有的数据。最后在数据模块中加入一个TSQLStoredProc控件,设定它的SQLConnection属性值为加入的TSQLConnection,再点击它的StoredProcName属性。对象查看器便会显示目前数据库中所有可以调用的存储过程。请从其中选择RAISESALARY这个存储过程。此时数据模块看起来如图2-40所示。

2-40  范例数据模块中的dbExpress控件,其中使用了

           TSQLStoredProc控件调用InterBase中的存储过程

步骤建立主窗体

在范例应用程序的主窗体中先点击File|Use Unit…菜单,选择使用刚才建立的数据模块。接着在主窗体中加入TDataSource控件,设定它的DataSet属性值为数据模块中的TSimpleDataSet控件。再加入TDBNavigator控件和TDBGrid控件,设定它们的DataSource属性值为刚才加入的TDataSource。最后放入一个TButton控件、一个TEdit控件和一个TComboBox控件。设定TButton控件的Caption属性值为加薪,设定TEdit控件的Text属性值为0.05。此时主窗体看起来如图2-41所示。

2-41  范例应用程序的主窗体

步骤实现范例应用程序

现在到了实现范例应用程序的时候了。首先在主窗体的OnActivate事件处理函数中取出EMPLOYEE数据表中所有记录的EID字段数值填入主窗体的TComboBox中,以便让用户能够选择要加哪一个员工的薪水。

procedure TForm1.FormActivate(Sender: TObject);

var

  aBK : TBookMark;

begin

  if (cbEID.Items.Count = 0) then

  begin

    aBK := dmCallStoredProc.scdsEmployee.GetBookmark;

    try

      cbEID.Items.BeginUpdate;

      dmCallStoredProc.scdsEmployee.First;

      while not dmCallStoredProc.scdsEmployee.Eof do

      begin

        cbEID.Items.Add(dmCallStoredProc.scdsEmployee.FieldByName('EID').Value);

        dmCallStoredProc.scdsEmployee.Next;

      end;

      cbEID.ItemIndex := 0;

    finally

      cbEID.Items.EndUpdate;

      dmCallStoredProc.scdsEmployee.GotoBookmark(aBK);

      dmCallStoredProc.scdsEmployee.FreeBookMark(aBK);

    end;

  end;

end;

上面的程序代码首先使用TBookMark的功能记录目前的位置,再一一取出EID的数值填入TComboBox中,最后再借助TBookMark回到起始的位置。

最后就是这个范例应用程序的主体了。在加薪按钮的OnClick事件处理函数中我们撰写如下的程序代码:

procedure TForm1.btnRaiseSalaryClick(Sender: TObject);

begin

  dmCallStoredProc.spRaiseSalary.Params.ParamByName('EID').Value :=

    cbEID.Text;

  dmCallStoredProc.spRaiseSalary.Params.ParamByName('RPERCENT').Value :=

    StrToFloat(edtPercent.Text);

  dmCallStoredProc.spRaiseSalary.ExecProc;

  dmCallStoredProc.scdsEmployee.Refresh;

end;

 

procedure TForm1.cbEIDChange(Sender: TObject);

begin

  dmCallStoredProc.scdsEmployee.Locate('EID', cbEID.Text, []);

end;

当用户点击了【加薪】按钮后,我们首先把主窗体中TEdit控件指定的加薪幅度借助数据模块中的TSQLStoredProc控件填入第二个参数中。要填入存储过程需要的参数,可以使用TSQLStoredProcParams属性值的ParamByName方法来找到特定的参数。我们也使用相同的方法把主窗体中TComboBox中用户选择的员工ID填入存储过程的第一个参数之中。最后调用TSQLStoredProc控件的Execute方法执行存储过程,并且调用TSQLClientDataSetRefresh方法重新显示加薪过后的最新数据。

现在编译并且执行这个范例。图2-42就是执行范例应用程序并且为0000000005这位员工加薪的画面。从画面中可以看到我们使用TSQLStoredProc控件成功地调用了RAISESALARY存储过程并且完成了加薪的操作。

 

2-42  范例应用程序调用存储过程为员工进行加薪的功能

在上面的范例中,我们调用一个不返回数值的存储过程。那么对于会返回数值的存储过程应该如何调用呢?例如图2-43显示了GetRecordCount存储过程会计算Books数据表中所有书籍的总数,并且返回这个数值。对于这个存储过程我们应该如何使用TSQLStoredProc来调用呢?

2-43  定义在InterBase中的GetRecordCount存储过程

这也很简单,当使用TSQLStoredProc控件调用会返回数值的存储过程时,在存储过程执行完毕之后,存储过程会把返回的数值储存在TSQLStoredProc控件的Params属性值中。开发人员只需要调用ParamsParamByName方法,并且以存储过程返回的数值名称作为ParamByName方法的参数即可。但是Delphi 2006在线辅助有错误的地方是要调用会返回参数的存储过程,开发人员仍然需要调用TSQLStoredProc控件的ExecProc方法,而不是设定Active属性值为True或是调用Open方法。

下面就是调用图2-43存储过程的程序代码,在调用ExecProc方法之后,再调用ParamByName方法并且传入IRECORDCOUNT作为参数数值即可。

procedure TForm1.Button1Click(Sender: TObject);

begin

  dmSP.spBookCount.ExecProc;

  Edit1.Text :=

    IntToStr(dmSP.spBookCount.Params.ParamByName('IRECORDCOUNT').Value);

end;

而图2-44就是一个范例应用程序调用GetRecordCount存储过程的画面,GetRecordCount存储过程果然返回了目前在Books数据表中有18笔的数据。

dbExpressTSQLStoredProc简化了调用存储过程的过程,开发人员可以使用TSQLStoredProc控件来调用dbExpress支持的关联数据库的存储过程。

2-44  使用TSQLStoredProc调用返回数值的存储过程