Delphi ADOStoredProc 存储过程用法

一、概述
Delphi   +   MS   SQL   Server
是目前最为流行的管理信息系统开发环境和工具。Delphi的强大数据库操作控件极大地减轻了开发人员的工作量,在这些控件中,最常用的有TQueryTTableTADOQueryTADOTableTADODataSete等,这些控件执行查询操作时有一个共同的特点,即将所有数据库记录从服务器取回客户端,再根据查询的条件进行筛选。很明显,如果有大量的数据在服务器与客户端之间传递,就会降低程序执行的速度,影响应用程序的性能。针对这种情况,MS   SQL   Server数据库和Delphi开发工具都提供了存储过程来解决这类问题。存储过程是一段在服务器上执行的程序,它在服务器端对数据库记录进行处理,再把结果返回到客户端。通过使用存储过程,一方面可以利用服务器强大的计算能力和速度,另一方面避免把大量的数据从服务器下载到客户端,减少网络上传输量,服务器只需将计算结果传给客户端,其效率之高是非常明显的。
二、创建存储过程
MS   SQL   Server上的存储过程可分为二类,一类是类似于select   查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户端,如
CREATE   procedure   proc1
@dw   char(20)
as
select   dwdm   from   cchdwdm   where   dw=@dw
该存储过程有一个输入参数   @dwdm,以数据集的形式返回结果。
另一类存储过程是通过输出参数返回信息或不返回信息,或只执行一个动作。如:
CREATE   procedure   proc2
@m1   smallint,
@m2   smallint
@result   int   OUTPUT
as
select   @result=@m1*@m2
该存储过程有二个输入参数@m1@m2,还有一个输出参数@result   
按照创建存储过程的时机来划分,创建存储过程也有二种方式,一是利用MS   SQL   ServerEnterprise   Manager中的SQL   Server   Query   Analyzer工具,此方法较简单,只要输入存储过程语句并保存即可。
创建存储过程的另一种方式是利用Delphi的控件,如TQueryTADOQuery,通过使用SQL语句在运行时动态地创建存储过程。如下例所示。
with   query1   do
begin
paramcheck   :=   false;
with   SQL   do
begin
clear;
add(’create   procedure   proc1’);
add(’@dw   char(20)’);
add(’as’);
add(’select   dwdm   from   cchdwdm   where   dw=@dw’);
end
execsql;
end;

三、存储过程的参数
存储过程一般有四种参数类型:
输入参数,由客户程序向存储过程传递
输出参数,由存储过程向客户传递
输入/输出参数,可双向传递
状态参数,由存储过程向客户返回错误信息
通过使用Delphi控件TADOStoredProcTStoredProc来设置或获取存储过程的参数,如:
ADOStoredProc1.parameters.parambyname(’@name’).value:=’
张三’;

四、在Delphi中使用存储过程的方法
Delphi中使用存储过程有以下几个步骤:
1
、把TADOStoredProcTStoredProc放到窗体上。
2
、设置参数连接到MS   SQL   Server数据库。
3
、设置ProcedureName参数,指定存储过程名,也可以在程序运行期设置。
4
、单击TParameters边上的省略号按钮,如果设置正确,则可看到所有的输入输出参数。
5
、在代码中设置存储过程的输入参数、执行存储过程并获取返回的数据。
通过调用TADOStoredProc控件的parambyname方法,设置好所有的输入参数,再调用open方法执行存储过程。如果存储过程返回参数,同样用parambyname方法获取参数值,如果返回数据集,则用访问数据集的TFields的方法获取各记录。如以下代码所示:

ADOStoredProc1.close;
ADOStoredProc1.parameters.parambyname(’@dwmc’).value:=’
某某单位’;   
ADOStoredProc1.prepared:=true;
ADOStoredProc1.open;
label1.caption:=   ADOStoredProc1.fields[0].asstring;

 

贴段别人写的ADOStoredProc1应用代码,存储过程以中文命名的,虽然有些不规范,原理尽在其中,包含存储过程的返回值获取,记录集的获取,参数传递。有些用ADOStoredProc进行操作时,要动态创建输入输出参数,其实用 ADOStoredProc1.Parameters.Refresh;将参数进行刷新一下就可以了。

procedure TForm1.Button1Click(Sender: TObject);
begin  //
根据动态赋参数序号赋值
 ADOStoredProc1.Close;
 DataSource1.DataSet:=ADOStoredProc1;
 ADOStoredProc1.ProcedureName:='
成绩查找';
 ADOStoredProc1.Parameters.Refresh;
 ADOStoredProc1.Parameters[1].Value:=200301001;
 ADOStoredProc1.Parameters[2].Value:=4;
 ADOStoredProc1.Parameters[3].Value:='SQL
数据库';
 ADOStoredProc1.Open;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin  //
根据动态赋参数名称赋值
 ADOStoredProc1.Close;
 DataSource1.DataSet:=ADOStoredProc1;
 ADOStoredProc1.ProcedureName:='
成绩查找';
 ADOStoredProc1.Parameters.Refresh;
 ADOStoredProc1.Parameters.ParamByName('@
学号').Value:=200301001;
 ADOStoredProc1.Parameters.ParamByName('@
学期').Value:=4;
 ADOStoredProc1.Parameters.ParamByName('@
课程名称').Value:='SQL数据库';
 ADOStoredProc1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin //
提取存储过程返回值
 ADOStoredProc1.Close;
 ADOStoredProc1.ProcedureName:='
带返回值的成绩查找';
 ADOStoredProc1.Parameters.Refresh;
 ADOStoredProc1.Parameters.ParamByName('@
学号').Value:=200301001;
 ADOStoredProc1.Parameters.ParamByName('@
学期').Value:=4;
 ADOStoredProc1.Parameters.ParamByName('@
课程名称').Value:='SQL数据库';
 ADOStoredProc1.Parameters.ParamByName('@
结果').Value:=null;
 ADOStoredProc1.ExecProc;
 Edit1.Text:=IntToStr(ADOStoredProc1.Parameters.ParamByName('@
结果').Value);
end;

procedure TForm1.Button3Click(Sender: TObject);
var i:integer;//
提取存储过程返回的多个结果集的方法,
begin //
返回第一个结果集
 DataSource1.DataSet:=ADODataSet1;
 if Button3.Caption='
返回第一个结果集' then
 begin
   ADOStoredProc1.Close;
   ADOStoredProc1.ProcedureName:='
学生';
   ADOStoredProc1.Open;
   ADODataSet1.Recordset:=ADOStoredProc1.Recordset;
   Button3.Caption:='
返回第二个结果集';
 end else
 begin
   ADODataSet1.Recordset:=ADOStoredProc1.NextRecordset(i);
   DataSource1.DataSet:=ADODataSet1;
   Button3.Caption:='
返回第一个结果集';
 end;
end;

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一个使用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.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值