Delphi(程序人生)

Delphi Programer DoubleCat

导航

SQL处理方案数据处理方案

SQL处理方案数据处理方案


 

数据处理方案分2种:

①应用程序数理处理方案,这种是数常用的,处理数据主要使用数据库控件及代码实现

②SQL数据处理方案,数据处理的大部分工作放在SQL服务器,使用触发器,存储过程等,应用程序主要向SQL服务器发送调用叁数


 

1,Delphi中能执行存储过程的控有二种

①StoredProc 这类组件BDE里有,DBG里有,DBExpress也有

②Query类型组件,同样,BDE里有,DBG里有,DBExpress里也有

Query,StroProc是调用有返回值和无返回值的都可以,StroProc用起来要比Query方便些,必竟他是专门用于执行存储过程的,它会自动读入存储过程所需要传入的叁数,


 

如果要执行有返回数据集的视图,只能用Query类的组件,其实视图与表的用法是一样的,Select * From 视图文件


 

如何用Query,StoredProc组件去执行一个存储过程呢?


 

下面是一个用存储过程增加记录的例子

存储过程代码如下:
--------------------------------------
CREATE PROCEDURE  ADDMENU(@ID VARCHAR(10),@WINENAME VARCHAR(20))  AS
BEGIN
    Set NoCount On
    Insert Into 菜单 (酒水编号,酒水名称) Values (@ID,@WINENAME)
   Set NoCount Off
END
GO
---------------用Query来执行是这样子的(必须动态传入叁数)------------------------------------------------

应用程序中用ADOQuery来执行这个存储过程(不要去给ADOQuery->Parameters设叁数名称)
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('ADDMENU;1:@ID,:@WineName');//存储过程名称后面加上(;1),后面跟的就是要传入的叁数
  ADOQuery1.Parameters.ParamByName('@ID').Value := Edit1.Text;//为叁数赋值
  ADOQuery1.Parameters.ParamByName('@WINENAME').Value := Edit2.Text;
  ADOQuery1.ExecSQL;
end;
------------------用StroedProc是这样子的(可以动态也可以静态)--------------------------------------------------
  ADOStoredProc1.Parameters.ParamByName('@ID').Value:=Edit1.Text;
  ADOStoredProc1.Parameters.ParamByName('@WINENAME').Value:=Edit2.Text;
  ADOStoredProc1.ExecProc;
----------------------------------------------------------------------------

 

 

再出一个例子

存储过程代码如下(返回A+B的值):
CREATE PROCEDURE HaHa (@a int , @b int, @c int OutPut)
AS
begin
 Select @c = @a + @b
end
GO
-----------------动态设置StroedProc叁数,并调用存储过程的方法-------------------------------------------------------------

procedure TForm1.Button3Click(Sender: TObject);
var
  s : string;
begin
      //-----写入第1个叁数----------
      ADOStoredProc1.ProcedureName:='HaHa;1'; //改变存储过程名称
      ADOStoredProc1.Parameters.Clear;//清除叁数
      ADOStoredProc1.Parameters.AddParameter;//叫用增加叁数过程
      ADOStoredProc1.Parameters[0].Name:='@a';//设置叁数名称
      ADOStoredProc1.Parameters[0].DataType:=ftInteger;//叁数的数据类型
      ADOStoredProc1.Parameters[0].Direction:=pdInput;//出叁还是入叁
      //-----写入第2个叁数----------
      ADOStoredProc1.Parameters.AddParameter;
      ADOStoredProc1.Parameters[1].Name:='@b';
      ADOStoredProc1.Parameters[1].DataType:=ftInteger;
      ADOStoredProc1.Parameters[1].Direction:=pdInput;
      //-----写入第3个叁数----------
      ADOStoredProc1.Parameters.AddParameter;
      ADOStoredProc1.Parameters[2].Name:='@c';
      ADOStoredProc1.Parameters[2].DataType:=ftInteger;
      ADOStoredProc1.Parameters[2].Direction:=pdInputOutput;
      //------给叁数赋值---------------
      ADOStoredProc1.Parameters.ParamByName('@a').Value:=12;
      ADOStoredProc1.Parameters.ParamByName('@b').Value:=13;
      ADOStoredProc1.ExecProc;
      ShowMessage(VarToStr(ADOStoredProc1.Parameters.ParamByName('@c').Value));
end;
---------Query调用有返回叁数的存储过程只能动态设置叁数,方法如下-----------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
   c:Variant;
begin
   ADOQuery2.SQL.Clear;
   ADOQuery2.SQL.Add('HaHa;1 :@a,:@b,:@c output');//注意如果是出叁一定要在动态设置叁数时,指明它是出叁,默认的都是入叁
   ADOQuery2.Parameters.ParamByName('@a').Value:=12;
   ADOQuery2.Parameters.ParamByName('@b').Value:=13;
   ADOQuery2.ExecSQL;
   c := ADOQuery2.Parameters.ParamByName('@c').Value;
   ShowMessage(VarToStr(c));
end;


 


posted on 2008-06-13 16:28  DoubleCat  阅读(779)  评论(0编辑  收藏  举报