Delphi ADOStoredProc 存储过程用法一、概述Delphi + MS SQL Server是目前最为流行的管理信息系统开发环境和工具。Delphi的强大数据库操作控件极大地减轻了开发人员的工作量,在这些控件中,最常用的有TQuery、TTable、TADOQuery、TADOTable、TADODataSete等,这些控件执行查询操作时有一个共同的特点,即将所有数据库记录从服务器取回客户端,再根据查询的条件进行筛选。很明显,如果有大量的数据在服务器与客户端之间传递,就会降低程序执行的速度,影响应用程序的性能。针对这种情况,MS SQL Server数据库和Delphi开发工具都提供了存储过程来解决这类问题。存储过程是一段在服务器上执行的程序,它在服务器端对数据库记录进行处理,再把结果返回到客户端。通过使用存储过程,一方面可以利用服务器强大的计算能力和速度,另一方面避免把大量的数据从服务器下载到客户端,减少网络上传输量,服务器只需将计算结果传给客户端,其效率之高是非常明显的。二、创建存储过程在MS SQL Server上的存储过程可分为二类,一类是类似于select 查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户端,如CREATE procedure proc1@dw char(20)asselect dwdm from cchdwdm where dw=@dw该存储过程有一个输入参数 @dwdm,以数据集的形式返回结果。另一类存储过程是通过输出参数返回信息或不返回信息,或只执行一个动作。如:CREATE procedure proc2@m1 smallint,@m2 smallint@result int OUTPUTasselect @result=@m1*@m2该存储过程有二个输入参数@m1、@m2,还有一个输出参数@result。 按照创建存储过程的时机来划分,创建存储过程也有二种方式,一是利用MS SQL Server的Enterprise Manager中的SQL Server Query Analyzer工具,此方法较简单,只要输入存储过程语句并保存即可。创建存储过程的另一种方式是利用Delphi的控件,如TQuery、TADOQuery,通过使用SQL语句在运行时动态地创建存储过程。如下例所示。with query1 dobeginparamcheck := false;with SQL dobeginclear;add(’create procedure proc1’);add(’@dw char(20)’);add(’as’);add(’select dwdm from cchdwdm where dw=@dw’);endexecsql;end;三、存储过程的参数存储过程一般有四种参数类型:输入参数,由客户程序向存储过程传递输出参数,由存储过程向客户传递输入/输出参数,可双向传递状态参数,由存储过程向客户返回错误信息通过使用Delphi控件TADOStoredProc或TStoredProc来设置或获取存储过程的参数,如:ADOStoredProc1.parameters.parambyname(’@name’).value:=’张三’;四、在Delphi中使用存储过程的方法在Delphi中使用存储过程有以下几个步骤:1、把TADOStoredProc或TStoredProc放到窗体上。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;