500 求三层完整例子。 本人刚开始学三层,现求三层完整例子,功能各方面都有涉及, 有详细一点的文档。只供学习用,不作其他用途。如有好的,可另给分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 随便自己写个webservice然后去调用!少说也三层了! 不好意思,忘了留mail,各位大虾!我的mail是 [email protected]如比较大也没关系,可通过msn与我联系[email protected]先谢了! 我耶要 呵呵 我耶是学习中..... mail: [email protected] 谢谢啦 看看,Delphi自带的Demo就一清二楚了. http://www.e-midas.cn/Soft_Show.asp?SoftID=8学习文档也在找个网站上找!兄弟我等着你的500分啊 我也在学习中要啊!我的msn:[email protected] 我的3层程序,可在客户端通过DCOM连接远程服务器执行任何SQL语句。支持两种,一种是数据查询的OPEN方式,一种是执行SQL语句(建立存储过程、视图、表,修改表)一、服务器unit 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.unit 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.unit 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. unit PublicP;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type PMyOpr = ^TMyOpr; TMyOpr = record OprInfo, OprSql: String; end;implementationend. 二、客户端unit 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.unit 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. 我的例子的层次: client --------com --------操作數據庫的Web Service --------統一數據管理的COM+ --------數據庫 http://www.2ccc.com/article.asp?articleid=1309有个三层代码下载 to: risingsoft(一苇渡江) ,以及所有的人请教一下:var ptrData: PMyOpr;出现 undeclared identifier:'PMyOpr'的错误,请问这是怎么回事? 由于[email protected]给我退信了我重新发给你一份到[email protected]里 请教统计的问题 ACCESS查询如何限制只显示列值大的一列? 问个dbchart画线的问题,比较抽象的。 呵呵,还有400分升星,先放个200分! 关于两个时间比较问题,谢谢! 关于IdTCPServer1向客户端发送数据问题 某些com接口调用中遇到的麻烦(高分请回答) 散散分吧,解决了几个头疼的问题,程序今天终于还是通了。 怎样实现工资软件中字段取值由用户自定义公式来实现 新手求助 [分享]圖像處理軟件---CNC PhotoEdit 1.0.1 请问Windows Media Player 控件有无类似onplaying事件?
少说也三层了!
各位大虾!
我的mail是 [email protected]
如比较大也没关系,可通过msn与我联系[email protected]
先谢了!
我耶要 呵呵 我耶是学习中.....
mail: [email protected]
谢谢啦
学习文档也在找个网站上找!
兄弟我等着你的500分啊
我的msn:[email protected]
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.unit 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.unit 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.
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
PMyOpr = ^TMyOpr;
TMyOpr = record
OprInfo,
OprSql: String;
end;implementationend.
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.
unit 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.
client
--------com
--------操作數據庫的Web Service
--------統一數據管理的COM+
--------數據庫
有个三层代码下载
请教一下:
var
ptrData: PMyOpr;
出现 undeclared identifier:'PMyOpr'的错误,
请问这是怎么回事?
我重新发给你一份到[email protected]里