关于三层,大家帮我看一下我的这种做法对吗?客户端怎么得到记录集呢?50分(50分)

  • 主题发起人 主题发起人 pag
  • 开始时间 开始时间
P

pag

Unregistered / Unconfirmed
GUEST, unregistred user!
我新建了一个ActiveX Library,然后向其中填加了一个DATA MOUDLE,在DATA MOUDLE中我加了一个ADOConnection1,ADOQuery1我定义了一个
function TdataM.conn(const connstr: WideString): WordBool;
begin
result:=true;
try
ADOConnection1.Connected:=false;
ADOConnection1.ConnectionString:=connstr;
ADOConnection1.Connected:=true;
except
result:=false;
end;
end;
用来设置连接,
一个
function TdataM.login(const userid, username: WideString): WordBool;
var sqlstr:String;
begin
result:=false;
sqlstr:='select * from operator where operator_name='+''''+userid+''''+' and operator_pwd='+''''+username+'''';
try
adoquery1.Close;
adoquery1.SQL.Text:=sqlstr;
adoquery1.Open;
if adoquery1.RecordCount>0 then
begin
result:=true;
exit;
end;
except
end;
end;
用来判断用户合法性(登陆)
我还定义了一个数据处理方法,
function process_data(const jyzm_str: WideString): WordBool;
begin
//此方法用来分割字符串jyzm_str,然后利用ADOQuery1存储
end
请问各位高手我这样做,是三层结构吗?你们一般在COM+中都提供一些什么方法呢?
还有如果我想提供一个返回记录集的方法应该怎么写呢?利用我这个Adoquery1,能实现吗?
如果不能怎么弄啊?请高手指点[:(]
 
我知道我的问题很菜,各位高手怎么光看不回啊?
高手在哪里?50等着你呢!如果嫌不够,尽管说话!可以再开贴加分啊!
 
需用RemoutDataModule
 
这也是三层结构呀,
三个函数调用而已呀,
如果叫高手看到真的是笑话呢,
幸亏我是小菜鸟的呀~~~~~~~~~~~~~~
呵呵~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
转载他人三层相关资料如下: 希望让你对三层结构有一点认识
MIDAS——多层分布式应用程序服务器

----对MIDAS这个名字一般有两种理解。MIDAS是Multi-
tierDistributedApplicationServicesSuite(多层分布式应用
程序服务包)的缩写,这也诠释了MIDAS技术的实质。也许因为
这个本义太长,很多人更愿意把它理解成Multi-tierMadeEasy,
这也是MIDAS的作用。多层计算(Multi-tieredcomputing)是
业界对此类技术通用的术语,而Multi-tier是Borland公司采
用的技术术语。Borland典型的三层结构如下:第一层是数据库
服务器,第二层是应用服务器,第三层是瘦客户机。

----数据库服务器是诸如InterBase、Oracle、Sybase、
MSSQLServer等数据库,应用服务器和瘦客户机由Delphi建立。
大多数情况下,数据库访问软件(例如BDE,SQL*NET等等)与
应用服务器运行在同一台机器上。

----应用服务器主要基于Borland的分布式数据技术,至少包括
两方面的内容:

----1.内置在Delphi组件中;


----2.OLEnterprise产品对分布式计算和负载平衡提供超强的支
持。

----内置在Delphi组件中使你能很容易地使用DCOM、Socket或
OLEnterprise连接两台机器,并在两者之间来回传输数据集。
OLEnterprise工具提供DCOM的选择方法简化了连接两台机器的
任务,尤其是对两台运行Windows95的机器更是如此。
OLEnterprise使用户能访问ObjectBroker,它允许在几个服务
器中随机分配任务负载。此外,还可以在几台机器上装载服务器
工具,每次实行连接时,Broker会选择其中一台机器。例如,如
果你有100个客户端和3台服务器,ObjectBroker会随机分配负
载给3台服务器,每台服务器大约有33个客户端。Broker会在
服务器异常关闭时提供支持。编写几行代码可以提供服务器错误
处理,把客户端从出现问题的服务器切换到另一台正常运行的服
务器。另外Broker不会试图把一个新的客户端连接到已经关闭
的服务器上,相反它会自动连接到其中一台正在运行的服务器
上。

----分布式数据集可以基于DCOM,在客户端没有任何数据库工具
的情况下读取远程数据。有些用户可能会有这样的疑问:通过浏
览器和Web服务器也能在客户端没有任何数据库工具的情况下观
察远程机器上的数据集,为什么还要采用分布式数据集呢?这是
因为浏览器的功能远不如Borland分布式数据集的功能。如果没
有一种强大的第三方工具(如IntraBuilder),要增强浏览器的
约束条件,或者在浏览器中加入或建立一个一到多的关系表是非
常困难的。但这些功能都可以在Delphi的多层应用程序中简单
地实现,Delphi的编译应用程序比基于HTML的应用更快速、更
易于应答。

----分布式数据集允许在客户端的应用中使用所有标准的Delphi
组件,包括数据库工具,但是客户端无须装载BDE、ODBC或者任
何数据库类库(例如OracleSQL*NET、SybaseCT-Lib等等)。当
然网络上的某些地方需要BDE或类似的引擎,但是客户端无须装
载。简言之,现在只需要一套服务器端的数据库工具,每一个客
户端就可以使用它。

----分布式数据集是缩减网络通信量的一种方法。从服务器端下
载数据后,在客户端操作数据而无须初始化任何网络交易,除非
需要更改服务器端。这意味着在不启动网络交易的情况下,可以
编辑、插入、删除多个记录。更改服务器数据时,可以在预先选
定的时间段内把多个数据包送到网络上。

----另外,当客户端从网络上断开时,仍然可以利用
“briefcasemodel"访问数据。其操作步骤如下:先把一个远程
数据库复制到磁盘上,然后关闭计算机,再重新引导它、断开网
络连接、编辑数据,接着重新联网并修改数据库。所有这些都可
以在没有大型数据库工具的客户端完成。这说明为了操作数据,
客户端不必每时每刻都与服务器连接。这对于膝上型计算机用户
和想要保持数据库通信量最小的站点是非常理想的。

----MIDAS技术的另一方面是提供访问数据库约束条件。当从服
务器上卸载数据时,可以同时卸载一套自动执行的约束条件。约
束条件可以帮助程序员确保用户输入合法的数据。当重新连到网
络上时,数据可以被正确地修改。如果你在更改数据库时偶然发
生了一个错误,那么内建的机制会帮助程序员报告和处理错误。
例如,如果另一个用户已经更改了你正试图更改的那条记录,那
么你将看到一个提示你如何处理的选项表。在
DelphiObjectRepository中的一个预建表单可以使你的应用程序
简单地实现错误处理。

----Borland多层计算的另一个重要功能是将数据库的负载分散
到多个服务器上。这样,一旦发生错误也能恢复。概括起来讲,
这些技术存在于三种Broker中:

----第一种叫做RemoteDataBroker,RemoteDataBroker结构的
精髓是让每一个客户端不再需要BDE,取而代之的是一个中央化
的BDE,以集中管理的方式降低每一个客户在BDE上所需的开销
和复杂度。

----第二种叫做ConstraintBroker,它所扮演的角色是保证所有
客户数据的一致性及数据的完整性。

----第三种是BusinessObjectBroker,它的目的是给一些关键性
的商业应用程序提供一个快速且可信赖的使用环境。为了满足这
种高层次的要求,BusinessObjectBroker会自动地将应用程序做
适当的划分,并复制重要的业务规则到每一个区间,以达到速度
的要求。

实现工具

----Borland提供了四种Delphi工具帮助用户实现分布式数据
集。前两个在服务器端:

----1.远程数据模块像标准数据模块一样,它不但可以将数据传
播到当前的应用中,而且会传到网络上的特定区域中。特别是它
们把简单的数据模块转化成COM对象,允许你通过DCOM访问远
程服务器上的数据库。

----2.TProvider组件就像可以驻留在标准数据模块中的TTable
组件一样,驻留在远程数据模块中,不同的是TProvider在网络
上发布数据表。TTable和TQuery组件都含有Provider属性。但
是如果把它作为一个独立的组件访问,会有更大的灵活性和力
量。特别是把TProvider组件与TTable或TQuery组件建立连接,
网络上的其它程序就可通过DCOM从TTable或TQuery访问数据。
远程数据模块的任务就是使客户端访问服务器上特定的
Provider。

----在客户端可以利用两个组件访问服务器提供的数据:

----1.TRemoteServer组件把客户端连到服务器上,特别是连到
服务器的远程数据模块上。更明确地说是连到远程数据模块支持
的COM接口上。TRemoteServer能浏览可用的服务器,一旦找到
服务器,TRemoteServer就可与之连接。

----2.TClientDataSet与TRemoteServer组件连接在一起,在服
务器上就得到一个特定的Provider。简言之,TClientDataSet
组件扮演了与TQuery或TTable同样的角色,只不过它是为远程
站点提供数据服务。如同在许多标准的Delphi应用程序中传统
TDatabase、TTable、TDataSource、TDBGrid组件的配置结构一
样,在远程数据集中使用TRemoteServer、TClientDataSet、
TDataSource和TDBGrid组件,它们的配置只是稍有不同。在这
个新的方案中,TRemoteServer的作用类似于TDatabase的作用,
而TClientDataSet组件与TTable或TQuery组件所起的作用又
极其相似。

结论

----MIDAS为多层结构的应用开发提供了强大的功能,这使得开
发者再也无需为越来越庞大的数据及应用发愁了。在
Delphi Client/Server版中打包了MIDAS的开发版,它可以用
于多层结构应用的开发及调试,在应用分布时,还需要另外购买
BorlandMIDASforDelphi。
 
这些资料我也看过,但我一些具体的东西,我还是不太理解!
例如我将应用服务器做成了一个EXE,在RemoutDataModule中放了一个Database1,Query1,Session1,datasetProvider1,设置好后,代码如下:
unit Unit11_52;
interface
uses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, Project11_5_TLB, StdVcl, Provider, Db, DBTables, Variants;
type
TTest115Server = class(TRemoteDataModule, ITest115Server)
Session1: TSession;
AdHocQuery: TQuery;
Database1: TDatabase;
AdHocProvider: TDataSetProvider;
procedure RemoteDataModuleCreate(Sender: TObject);
procedure RemoteDataModuleDestroy(Sender: TObject);
procedure AdHocQueryAfterOpen(DataSet: TDataSet);
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
override;
function GetDatabaseNames: OleVariant;
safecall;
procedure SetDatabaseName(const DBName, UserName, Password: WideString);
safecall;
public
{ Public declarations }
end;

implementation
uses Unit11_51;
{$R *.DFM}
class procedure TTest115Server.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 TTest115Server.GetDatabaseNames: OleVariant;
var
I: Integer;
DBNames: TStrings;
begin
// 创建一个字符串数组来存放BDE所有的数据库别名数据。
DBNames := TStringList.Create;
try
// 利用Session组件来获取目前BDE所有的数据库别名数据。
Session1.GetDatabaseNames(DBNames);
// 建立一个变量数组给函数返回变量Result。
Result := VarArrayCreate([0, DBNames.Count - 1], varOleStr);
// 最后再把数据库别名数据指定给此变量数组。
for I := 0 to DBNames.Count - 1do
Result := DBNames;
finally
DBNames.Free;
end;
end;

procedure TTest115Server.SetDatabaseName(const DBName, UserName,
Password: WideString);
begin
try
// 把前台传来的数据库别名、用户在线名称、用户在线密码
// 等三项数据指定给Tdatabase组件,并且运行连接的操作。
Database1.Close;
Database1.AliasName := DBName;
if (UserName<>'') and (Password<>'') then
begin
Database1.Params.Values['PASSWORD'] := Password;
Database1.Params.Values['USER NAME'] := UserName;
end;
Database1.Open;
except
// 如果连接时发生错误时,则产生一个exception给前台程序
// 前台程序将会利用到这个exception来判断是否要把输入在
// 线数据的窗口叫起来。
on E: EDBEngineErrordo
raise Exception.Create('Password Required') ;
end;
end;

procedure TTest115Server.RemoteDataModuleCreate(Sender: TObject);
begin
// 增加一位前台的在线者(调用Form1上的过程)
MainForm.UpdateClientCount(1);
end;

procedure TTest115Server.RemoteDataModuleDestroy(Sender: TObject);
begin
// 减少一位前台的在线者(调用Form1上的过程)
MainForm.UpdateClientCount(-1);
end;

procedure TTest115Server.AdHocQueryAfterOpen(DataSet: TDataSet);
begin
// 新打开一个TQuery查询(调用Form1上的过程)
MainForm.IncQueryCount;
end;

initialization
TComponentFactory.Create(ComServer, TTest115Server,
Class_Test115Server, ciMultiInstance, tmApartment);
end.
我客户端加了一个:
DCOMConnection1,ClientDataSet1,DataSource1,dbgrid,button1,
调用如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, StdCtrls, Grids, DBGrids, DBClient, MConnect, SConnect,
ObjBrkr;
type
TForm1 = class(TForm)
DCOMConnection1: TDCOMConnection;
ClientDataSet1: TClientDataSet;
DBGrid1: TDBGrid;
Button1: TButton;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
DCOMConnection1.Connected:=true;
ClientDataSet1.CommandText:='select * from emp_info where rybh=1';
ClientDataSet1.Open;
end;
end.

我想问各位高手,这是三层结构吗?如果是,和C/S结构有什么区别,我不是一样要在客户端写SQL语句!也就是说业务逻辑不是一样放在了客户端?
还有,如果我在RemoutDataModule中不用BDE,而是放一个ADOConnection1,ADOQuery1,datasetProvider1为什么我客户端就报错呢,说是"Commandtext changes are not allowd",难道用这种方式我就用不了ADO了吗?
 
1.这是三层结构吗?如果是,和C/S结构有什么区别,我不是一样要在客户端写SQL语句
一般都是SQL放在服务器端,然后定义接口.由客户端传参数,在服务器端组织SQL然后查询.
2.说是"Commandtext changes are not allowd",难道用这种方式我就用不了ADO了吗?
服务器端的DataSetProvider1的Option中设置[poAllowCommandText],就可以在客户端使用CommandText了.
 
你可以用在接口中定义的方法来完成一些特定的业务流程,用来传递数据包,字符串等等
其数据查询等操作可以放在服务端,然后以数据包的形式回传客户端。
具体就看你怎么设计
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
717
import
I
后退
顶部