调用存储过程
使用存储过程的一般步骤要访问服务器上的存储过程,一般是这么几个步骤:第一步,把一个TStoredProc构件放到窗体或数据模块上。第二步,设置DatabaseName属性指定一个数据库,可以设为BDE别名或者应用程序专用的别名(如果用TDatabase构件连接数据库的话)。第三步,设置StoredProcName属性指定存储过程的名称。如果前面正确设置了DatabaseName属性,就可以从一个下拉列表中选择一个存储过程。由于经常要在运行期执行不同的存储过程,因此,StoredProcName属性一般是在运行期设置的
第四步,单击Params边上的省略号按钮打开一个编辑器。如果第二步和第三步设置正确的话,在这个编辑器中将显示所有的输入和输出参数,否则,这个编辑器就是空的。要说明的是,并不是所有的服务器都能够提供有关的参数的信息。如果服务器没有提供有关参数的信息,就得自己建立这些参数。
准备和执行存储过程在执行存储过程之前,最好先通知服务器准备好,这就要调用TStoredProc构件的Prepare函数,例如:StoredProc1.Prepare;注意:如果应用程序在运行期改变了参数的信息,必须重新调用Prepare函数。要执行存储过程,可以调用TStoredProc构件的ExecProc函数,程序示例如下:StoredProc1.Params[0].AsString := Edit1.Text;StoredProc1.Prepare;StoredProc1.ExecProc;注意:如果在调用ExecProc之前没有调用Prepare,TStoredProc构件会自动把参数准备好,存储过程执行完毕后,再自动取消准备。不过,如果一个存储过程要反复执行多次的话,最好显式地调用Prepare,不再需要执行存储过程
时调用UnPrepare函数。执行了存储过程后,它有可能返回这样几种数据:l 一是数据集,可以用标准的数据控件显示其中的数据。l 二是输出参数。l 三是状态信息。
创建一个存储过程存储过程一般是用专门的工具编写的。不过,这里要介绍的是怎样用SQL语句在运行期动态地创建存储过程。对于不同的服务器来说,即使是相同功能的存储过程,SQL语句也有可能是不同的,因此,必须事先查阅服务器的文档。
使用SQL语句创建存储过程要使用SQL语句创建存储过程,就要用到TQuery构件的SQL属性。如果存储过程中要用到参数的话,必须把TQuery构件的ParamCheck属性设为False。下面的例子演示了怎样用SQL语句创建一个存储过程:With Query1 DoBeginParamCheck := False;
With SQL DoBeginClear;Add('CREATE PROCEDURE GET_MAX_EMP_NAME');Add('RETURNS (Max_Name CHAR(15))');Add('AS');Add('BEGIN');Add('SELECT MAX(LAST_NAME)');wAdd('FROM EMPLOYEE');Add('INTO :Max_Name;');Add('SUSPEND;');Add('END');End;ExecSQL;End;当然,也可以用SQL Explorer来创建存储过程。
用TStoredProc构件检索数据集要用TStoredProc构件从存储过程中检索数据集,必须设置StoredProcName属性指定一个存储过程的名称。如果存储过程需要传递输入参数的话,可以通过Params属性或ParamByName函数提供参数。例如,Sybase服务器上有一个存储过程叫GET_EMPLOYEES,它有个输入参数叫@EMP_NO。下面是这个存储过程的代码:CREATE PROCEDURE GET_EMPLOYEES @EMP_NO SMALLINTAS SELECT EMP_NAME, EMPLOYEE_NO FROM EMPLOYEE_TABLEWHERE (EMPLOYEE_NO = @EMP_NO)相应地,要通过上面这个存储过程检索数据集,程序应当这样写:With StoredProc1 DoBeginClose;ParamByName('@EMP_NO').AsSmallInt := 52;Active := True;End;
存储过程的参数要执行服务器上的存储过程,往往要传递一些参数。这些参数分为四种类型:第一种称为输入参数,由客户程序向存储过程传递值。第二种称为输出参数,由存储过程向客户程序返回结果。第三种称为输入/输出参数,既可以由客户程序向存储过程传递值,也可以由存储过程向客户程序返回结果。第四种称为状态参数,由存储过程向客户程序返回错误信息。要说明的是,并不是所有的服务器都支持上述四种类型的参数,例如,InterBase就不支持状态参数。可以通过TStoredProc构件的Params属性访问存储过程的参数(TParam对象)。如果在设计期正确设置了StoredProcName属性,Params属性中将自动包含存储过程的参数,否则,需要自己建立参数。
调用存储过程推荐使用Query,Adoquery组件
query.close;
query.sql.clear;
query.sql.add('exec db.prtemp(@id=:id)');
query.parambyname('id').asinteger:=1;
query.open;
也可用Tstoredproc
storedproc1.active=false;
storedproc1.databasename="dbname";
storedproc1.storedprocname="strdprcname";
storedproc1.params.clear;
storedproc1.params.createparam(ftstring,"p1",ptinput);
storedproc1.params.createparam(ftstring,"p2",ptinput);
storedproc1.params.parambyname("p1").asstring:=varstring1;
storedproc1.params.parambyname("p2").asstring:=varstring2;
storedproc1.active=true;
调用存储过程最好使用Query组件,本人就是用Tstoredproc组件而屡屡出错!这一段痛心疾首的错误老是涉及到ISAPI32.dll,让我这个丈二和尚模不到屁股。使用Query控件调用存储过程如下:
加入你的存储过程有两个参数:
CREATE PROCEDURE Procedure_Name @proc1 int,@proc2 char(8)
AS
……
则你的Query1控件的代码如下:
With Query1 do
Begin
Close;
SQL.Clear;
SQL.Add(' Exec Procedure_Name :proc1,:proc2 ');
ParamByName('proc1').Value:=4;
ParamByName('proc2').Value:='Hello';
Try
ExecSQL;
Except
raise;
End
End