当前位置:首页 > 分布式多层数据库开发
function TPcSQL.GetDatabasenames: OleVariant; begin end;
procedure TPcSQL.SetDatabasename(const DBname, Username, Password: WideString); begin end;
function TPcSQL.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 - 1 do Result[I] := DBNames[I]; Finally
//如果错误就把构造的DBNames释放掉。
DBNames.Free; end; end;
上面的函数的关键除了取得BDE 数据库别名以外,还声明了一个变量数 组来存放数据库别名数据,所以用VarArrayCreate函数建立一个变量数组, 其中 参数1: 指定数组范围
参数2: 数组数据类型,由于别名要通过DCOM传给前台,数据类型必 须设成varOleStr 才有效。
同时还要说明VarArrayCreate函数是在Variants单元中建立的,所以,在implementation下还需要声明:
uses Variants;
否则会编译出错,,必要时还要加上Unit1。
第二个过程是客户机提供上来的联机数据。
procedure TPcSQL.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: EDBEngineError do
raise Exception.Create('Password Required') ; end; end;
第六节 服务器端进行客户计数
除了上面的功能外,这个程序还加上了一个在线用户以及查询用户统计 的功能。由于这个应用程序执行模式是 Multiple Instance执行模式,所以 当某个前台第一次连上线后,应用程序服务器会激活RemoteDataModule的 事件程序,而断线后又会执行OnDestroy事件程序,因此就可以用这两个事件 计算连上服务器的用户个数。至于Query个数的计算,则由TQuery的OnAfterOpen事件函数判断。
----------------------------------------------------------------- Form1部分,主要用于显示
-----------------------------------------------------------------
首先在form上安放五个Tlabel控件,其中四个放在一个容器Panel1里 两个计数的label分别取名为ClientCount和QueryCount。属性Capyion=0 。
注意,下面的程序在Form1所在的单元Unit1中编写。
在private下声明两个变量:
FQueryCount: Integer; FClientCount: Integer;
在public下声明两个过程
procedure UpdateClientCount(Incr: Integer); procedure IncQueryCount;
在实现区写入过程:
procedure Tform1.UpdateClientCount(Incr: Integer); begin
FClientCount := FClientCount + Incr;
ClientCount.Caption := IntToStr(FClientCount); end;
procedure Tform1.IncQueryCount; begin
Inc(FQueryCount);
QueryCount.Caption := IntToStr(FQueryCount); end;
共分享92篇相关文档