调用存储过程


使用存储过程的一般步骤要访问服务器上的存储过程,一般是这么几个步骤:第一步,把一个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  

posted @ 2009-01-23 11:10  vincent.lee  阅读(530)  评论(0编辑  收藏  举报