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;