首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

●哪位高手给个流行的典型的三层的例子,越简单越好,记录增删改即可

2012-02-25 
●●●谁给个流行的典型的三层的例子,越简单越好,记录增删改即可谢谢[解决办法]一個簡單的數據訪問層.interfa

●●●谁给个流行的典型的三层的例子,越简单越好,记录增删改即可
谢谢

[解决办法]
一個簡單的數據訪問層.
interface
uses
Classes, ADODB, DB, SysUtils, Dbtables, Variants, Forms;

type
TDataAccess = class
public
function GetSQLValue(ASQLStr: string; var AValue: Variant): Boolean; overload; virtual;
function GetSQLValue(ASQLStr: string; var AValue: string): Boolean; overload; virtual;

procedure ExecSQL(ASQLStr: string); virtual; abstract;
function OpenSQL(ASQLStr: string; var ADataSet: TDataSet): Boolean; virtual; abstract;
end;

TServerAccess = class(TDataAccess)
private
function GetCommQuery: TADOQuery;
procedure FreeCommQuery(AQuery: TADOQuery);
public
ADOConnection: TADOConnection;
ConnectString: string;
constructor Create;
destructor Destroy; override;

procedure ExecSQL(ASQLStr: string); override;

function OpenSQL(ASQLStr: string; var ADataSet: TDataSet): Boolean; override;
procedure InitAll; virtual;
end;

TClientAccess = class(TDataAccess)
private
DataBaseName: string; //{ DONE : 等待赋值 }
function GetCommQuery: TQuery;
procedure FreeCommQuery(AQuery: TQuery);
public
constructor Create;
procedure ExecSQL(ASQLStr: string); override;
function OpenSQL(ASQLStr: string; var ADataSet: TDataSet): Boolean; override;

class procedure CreateAlias;
procedure InitAll;
end;
implementation
constructor TServerAccess.Create;
begin
ADOConnection := TADOConnection.Create(nil);
end;

destructor TServerAccess.Destroy;
begin
ADOConnection.Free;
inherited;
end;

procedure TServerAccess.ExecSQL(ASQLStr: string);
var
tmpQuery: TADOQuery;
begin
tmpQuery := GetCommQuery;
try
tmpQuery.Close;
tmpQuery.SQL.Text := ASQLStr;
tmpQuery.ExecSQL;
finally
freeCommQuery(tmpQuery);
end;
end;
procedure TServerAccess.FreeCommQuery(AQuery: TADOQuery);
begin
FreeAndNil(AQuery);
end;

function TServerAccess.GetCommQuery: TADOQuery;
begin
Result := TADOQuery.Create(nil);
Result.Connection := ADOConnection;
end;
procedure TServerAccess.InitAll;
begin

end;
function TServerAccess.OpenSQL(ASQLStr: string;
var ADataSet: TDataSet): Boolean;
var
tmpADOQuery: TADOQuery;
begin
tmpADOQuery := GetCommQuery();
tmpADOQuery.SQL.Text := ASQLStr;
tmpADOQuery.Open;
Result := tmpADOQuery.RecordCount > 0;
ADataSet := tmpADOQuery;
end;
constructor TClientAccess.Create;
begin
DataBaseName := 'selfold ';
end;

class procedure TClientAccess.CreateAlias;
var
tmpStrList: TStringList;
begin
Session.DeleteAlias( 'selfold ');
Session.SaveConfigFile;
if not Session.IsAlias( 'selfold ') then
begin
tmpStrList := TStringList.Create;
try
tmpStrList.Add( 'path = ' + ExtractFilePath(Application.ExeName) + 'HS_DATA ');
Session.AddAlias( 'selfold ', 'STANDARD ', tmpStrList);
Session.SaveConfigFile;
finally
tmpStrList.Free;
end;
end;
end;

procedure TClientAccess.ExecSQL(ASQLStr: string);
var
tmpQuery: TQuery;
begin
tmpQuery := GetCommQuery;
tmpQuery.SQL.Text := ASQLStr;
tmpQuery.ExecSQL;
FreeCommQuery(tmpQuery);


end;

procedure TClientAccess.FreeCommQuery(AQuery: TQuery);
begin
AQuery.Free;
end;

function TClientAccess.GetCommQuery: TQuery;
begin
Result := TQuery.Create(nil);
Result.DatabaseName := DataBaseName;
end;

procedure TClientAccess.InitAll;
begin

end;

function TClientAccess.OpenSQL(ASQLStr: string;
var ADataSet: TDataSet): Boolean;
var
tmpQuery: TQuery;
begin
tmpQuery := GetCommQuery;
tmpQuery.RequestLive := True;
tmpQuery.SQL.Text := ASQLStr;
tmpQuery.Open;
ADataSet := tmpQuery;

Result := tmpQuery.RecordCount > 0;

end;
{ TDataAccess }

function TDataAccess.GetSQLValue(ASQLStr: string;
var AValue: Variant): Boolean;
var
tmpDataSet: TDataSet;
i: Integer;
begin
Result := OpenSQL(ASQLStr, tmpDataSet);
try
if Result then
begin
AValue := VarArrayCreate([0, tmpDataSet.FieldCount], varVariant);
for I := 0 to tmpDataSet.FieldCount - 1 do // Iterate
begin
AValue[I] := tmpDataSet.Fields[I].AsString;
end; // for
end;
finally
tmpDataSet.Close;
tmpDataSet.Free;
end;


end;

function TDataAccess.GetSQLValue(ASQLStr: string;
var AValue: string): Boolean;
var
tmpDataSet: TDataSet;
begin
Result := OpenSQL(ASQLStr, tmpDataSet);
try
if Result then
AValue := tmpDataSet.Fields[0].AsString;

finally
tmpDataSet.Close;
tmpDataSet.Free;
end;

end;


[解决办法]
www.2ccc.com
汽车租赁管理软件 (三层)
[解决办法]
不如去下載petShop 看看微軟怎麼分層的:)

有好多層呢,不只三層還是蠻經典的.
[解决办法]
看《Delphi 深度编程及其项目应用开发》这本书后面就有个三层结构的例子,可以在盒子那下电子书及附书源码
[解决办法]
一个三层的例子:

应用服务器的编写:
(1)新建一个工程
(2)点击“File”“New”“Other”,选择Multiter页标签的Remote Data Module
(3)设置CoClassName(例:输入TestServer),点击OK就会进入Remote Data Module编辑框
(4)在编辑框中可以添加任何与数据库相连的组件,既然你的机器上装了sql server ,你就可以 添加一个ADOConnection和ADOTable,进行数据库的连接设置。这里我要提醒一句,就是在用ADOConnection连接数据库的时候,最好把登陆数据库的密码保存下来,并且ADOTable1.active不要设置为True!!!然后再添加一个DataSetProvider1(在Data Access页中),并将其DataSet设置为TADOTable1.
(5)编译运行此程序,就算注册了


客户端的编写:
(1)新建一个工程文件
(2)在其中添加SocketConnection1(在DataSnap页中),将它的Host设置为你的应用服务器所在的机器名,在ServerName的下拉列表框中选择应用服务器的名称,port默认为211(注意:TSocketConnection靠的是TCP/IP协议进行通讯,所以要在应用服务器端需额外运行Scktsrvr.exe程序,该程序在..\\Borland\Delphi6\Bin目录里)
(3)然后添加一个ClientDataSet1(在Data Access中),将其RemoteServer设置为SocketConnection1,将PorviderName设置为DataSetProvider1,
(4)再添加一个DataSouce1和一个DbGrid1,将DataSouce1.DataSet设置为ClientDataSet1,DBGrid1.DataSource设置为DataSource1
(5)在FormCreate中编写代码如下:
procedure TForm1.FormCreate(Sender:TObject);
begin
SocketConnection1.Connected:=True;
ClientDataSet1.Active:=True;
end;
(6)编译运行,你的客户端就可以读取Sql Server数据库中的数据了!

热点排行