初学三层,大家帮忙给个例子,给出应有层和客户层的代码,很简单的就好,比如登录这一块的代码。
help!!!!
help!!!!
解决方案 »
- RunTime Error 217
- StringGrid中每此点击cell时,当前cell的颜色会改变,如何使其保留原来的颜色不变呢?
- 如何取出treeview中一个结点的data值?
- 能在win2000登录前运行我的程序吗?
- TComboBox的一个问题
- 再谈谈日期时间的导入
- 如何调试 delphi midas 应用服务器?高分
- 关于用idhttp登录php网站问题
- 程序不能保留原貌!及其不便…………
- "bokei(一夜好眠)"你在吗,我不知道怎样"把Connection的LoginPrompt设置为False"
- 用Delphi的都是高手,哪位高手使用过TAPI过来帮助一下!
- 求汽修厂管理软件一套,流程图加设计方案,我的QQ:35606156,在线
1、创建TDataModule,TDmSrv = class(TDataModule),添加组件
保存PAS为DmSrvP.pas
adoSrv: TADOConnection;
AdoQry: TADOQuery;
AdoQry连接adoSrv 2、创建远程数据模块TRemoteDataModule
File->New->Multitier->Remote Data Module->
CoClassName:RDmSrv->ok 3、在RDmSrv上放一组件
dspAdoQry: TDataSetProvider; 属性DataSet:DmSrv.AdoQry
注意:在implementation段下加入代码
uses DmSrvP;二、客户端设计 1、建立TDataModule,TDmCli = class(TDataModule),添加组件
DCOMConn: TDCOMConnection;
cdsDSet: TClientDataSet;
dsDSet: TDataSource;
dsDSet连cdsDSet连DCOMConn,DCOMConn的ServerName连YliaoServer.RDmSrv,
注意YliaoServer是我的服务器工程名三、思路 1、客户端执行SQL代码,提交给中间层TClientDataSet,触发dspAdoQryDataRequest
2、在dspAdoQryDataRequest事件里,编写查询、操作DmSrv数据模块里数据库的方法
四、功能介绍 1、在客户端输入SQL代码,分查询数据的(对应Query.Open)与执行的(对应Query.ExecSQL)。然后选是“查询O”还是“执行E”,将标志O或E接到SQL代码首位置
2、执行DataRequest,触发服务器DataRequest
3、在服务器DataRequest,区分代码,连接DmSrv里AdoQry,装载SQL代码,OPEN或EXECSQL
Forms,
MainP in 'MainP.pas' {Main},
DmSrvP in 'DmSrvP.pas' {DmSrv: TDataModule},
YliaoServer_TLB in 'YliaoServer_TLB.pas',
RDmSrvP in 'RDmSrvP.pas' {RDmSrv: TRemoteDataModule} {RDmSrv: CoClass},
PublicP in 'PublicP.pas';{$R *.TLB}{$R *.RES}begin
Application.Initialize;
Application.CreateForm(TMain, Main);
Application.CreateForm(TDmSrv, DmSrv);
Application.Run;
end.★MainP.pasunit MainP;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TMain = class(TForm)
gbSQL: TGroupBox;
memSQL: TMemo;
gbOpr: TGroupBox;
lbOpr: TListBox;
procedure FormShow(Sender: TObject);
procedure lbOprClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
Main: TMain;implementationuses DmSrvP, PublicP;{$R *.DFM}procedure TMain.FormShow(Sender: TObject);
begin
lbOPR.Clear;
memSQL.Clear;
DmSrv.adoSrv.Connected := False;
DmSrv.adoSrv.Connected := True;
end;procedure TMain.lbOprClick(Sender: TObject);
var
ptrData: PMyOpr;begin
if lbOpr.Items.Count < 1 then exit;
if lbOpr.ItemIndex < 0 then exit; ptrData := PMyOpr(lbOpr.Items.Objects[lbOpr.ItemIndex]);
memSQL.Clear;
memSQL.Lines.Add(ptrData^.OprSql);
end;procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DmSrv.adoSrv.Connected := False;
end;end.★RDmSrvP.pasunit RDmSrvP;interfaceuses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, YliaoServer_TLB, StdVcl, Provider, Dialogs;type
TRDmSrv = class(TRemoteDataModule, IRDmSrv)
dspAdoQry: TDataSetProvider;
function dspAdoQryDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
public
{ Public declarations }
end;implementationuses DmSrvP, MainP, PublicP;{$R *.DFM}class procedure TRDmSrv.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;function TRDmSrv.dspAdoQryDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;var lsFlag,
lsExec,
lsSQL,
lsSucc,
lsStr: String; ptrData: PMyOpr;
begin
Result := 'T'; lsStr := Trim(String(Input));
lsFlag := UpperCase(Copy(lsStr,1,1));
lsSQL := Copy(lsStr,2,length(lsStr)-1);
lsSucc := '成功!'; if DmSrv.adoSrv.InTransaction then
DmSrv.adoSrv.RollbackTrans;
DmSrv.adoSrv.BeginTrans; with DmSrv.AdoQry do
begin
Close;
SQL.Clear;
SQL.Add(lsSQL);
if lsFlag='O' then
begin
lsExec := '查询';
try
Open;
except
Cancel;
DmSrv.adoSrv.RollbackTrans;
lsSucc := '失败!';
Result := 'F';
end;
end
else if lsFlag='E' then
begin
lsExec := '执行';
try
ExecSQL;
except
Cancel;
DmSrv.adoSrv.RollbackTrans;
lsSucc := '失败!';
Result := 'F';
end;
end
else
begin
lsExec := '未知操作';
lsSQL := lsStr;
lsSucc := '失败!';
Result := 'F';
DmSrv.adoSrv.RollbackTrans;
end; TRY
DmSrv.adoSrv.CommitTrans;
except
end; ptrData := new(PMyOpr);
ptrData^.OprInfo := lsExec+' SQL代码 '+lsSucc;
ptrData^.OprSql := lsSQL;
Main.lbOpr.Items.AddObject(ptrData^.OprInfo, TObject(ptrData)); Main.memSQL.Clear;
Main.memSQL.Lines.Add(ptrData^.OprSql);
end;
end;initialization
TComponentFactory.Create(ComServer, TRDmSrv,
Class_RDmSrv, ciMultiInstance, tmApartment);
end.★DmSrvP.pasunit DmSrvP;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB;type
TDmSrv = class(TDataModule)
adoSrv: TADOConnection;
AdoQry: TADOQuery;
private
{ Private declarations }
public
{ Public declarations }
end;var
DmSrv: TDmSrv;implementation{$R *.DFM}end.
Forms,
MainP in 'MainP.pas' {Main},
DmCliP in 'DmCliP.pas' {DmCli: TDataModule};{$R *.RES}begin
Application.Initialize;
Application.CreateForm(TMain, Main);
Application.CreateForm(TDmCli, DmCli);
Application.Run;
end.★MainP.pasunit MainP;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, Buttons;type
TMain = class(TForm)
rgEXEC: TRadioGroup;
gbSQL: TGroupBox;
btnEXEC: TBitBtn;
btnQuit: TBitBtn;
memSQL: TMemo;
gbResult: TGroupBox;
dbgResult: TDBGrid;
dbnResult: TDBNavigator;
lblTime: TLabel;
procedure btnEXECClick(Sender: TObject);
procedure btnQuitClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
Main: TMain;implementationuses DmCliP;{$R *.DFM}procedure TMain.btnEXECClick(Sender: TObject);
var
NowTime: TDateTime;
TimeStr,PassWord: String;
begin
if DmCli.DCOMConn.Connected = false then
begin
ShowMessage(' 提示:尚未连接远程DCOM服务器! ');
exit;
end;
if Trim(memSQL.Text) = '' then
begin
ShowMessage(' 提示:尚未输入启动操作代码(SQL)! ');
exit;
end; NowTime := Now;
TimeStr := FormatDateTime('YYYY-MM-DD HH:NN:SS',NowTime);
lblTime.Caption := TimeStr;
PassWord := ''; if MessageDlg(' 警告:确定启动本次操作吗? ',mtConfirmation,[mbYes,mbNo],0) <> mrYes then exit; if InputQuery('密码验证:','请输入密码验证你是否具备操作权限...',PassWord) = false then exit; if PassWord <> FormatDateTime('DDMMYYYY.SSNNHH',NowTime) then
begin
ShowMessage(' 信息:操作权限不足,不能启动操作! ');
exit;
end; DmCli.cdsDSet.Close;
case rgExec.ItemIndex of
0:
begin
IF DmCli.cdsDSet.DataRequest('O'+memSQL.Text) = 'T' then
begin
gbResult.Caption := '客户端执行结果(成功):';
try
DmCli.cdsDSet.Open;
except
end;
end
else
begin
gbResult.Caption := '客户端执行结果(失败):';
end;
end;
1:
begin
IF DmCli.cdsDSet.DataRequest('E'+memSQL.Text) = 'T' then
begin
gbResult.Caption := '客户端执行结果(成功):';
try
DmCli.cdsDSet.Open;
except
end;
end
else
begin
gbResult.Caption := '客户端执行结果(失败):';
end;
end;
end;end;procedure TMain.btnQuitClick(Sender: TObject);
begin
Close;
end;procedure TMain.FormShow(Sender: TObject);
begin
memSQL.Clear;
lblTime.Caption := ''; DmCli.DCOMConn.Connected := False;
try
DmCli.DCOMConn.Connected := True;
except
ShowMessage(' 信息:无法连接远程DCOM服务器! ');
Close;
exit;
end;
end;procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DmCli.DCOMConn.Connected := False;
end;end.★DmCliP.pasunit DmCliP;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBClient, MConnect;type
TDmCli = class(TDataModule)
DCOMConn: TDCOMConnection;
cdsDSet: TClientDataSet;
dsDSet: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end;var
DmCli: TDmCli;implementation{$R *.DFM}end.
接口函数
Query1.Open;
DSP1.DataSet:=Query1;
Result:=tmpDSP1.Data;客户端接收后。
CDS1.Data:=Connection1.AppServer.MethodName;