程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DELPHI多層分布式開發2)

DELPHI多層分布式開發2)

編輯:Delphi
 

客戶端查詢服務器端的別名集

在SQL 查詢以前,用戶往往需要指定查詢哪個數據庫,所以需要把服務器上BDE 數據庫別名(Alias )設置數據抓到前台程序來具體做法我們通過一個實例來解決:

還是先回到服務器端:

在上述服務器端再建立一個TSession和一個TdataBase(在BDE 頁下)

Session1屬性:

AutoSessionName=true

SessionName=Session1_4 
(運行中是可以自動調整的)

KeepConnection=true

Active=true

DataBase1屬性:

AliasName: 連接數據庫別名(比如Mymdb)

DataBaseName: 自定義的名(這裡比如為a)

SessionName: Session1_4 (SessionName值)

如果不希望輸入密碼:

LoginPrompt : false

這樣Query1的連接屬性要變一下,因為它要通過Database來聯接數據庫(以後在前台可以直接通過改變DataBase的屬性來改變聯接)

DataBaseName= DataBase1的DataBaseName:自定義的名(這裡比如為a)。

SQL屬性輸入一個基本的SQL語言:select * from 獎金 Active=true 表示這樣也可以連接上了。

TQurey 增加個屬性

SessionName: Session1_4

這樣就可以用Session對象來管理數據源的信息了。

再加入四個Label,顯示當前在線人數,以及進行SQL 查詢的人數。

為了傳給客戶端值,並能夠由客戶端來對服務器端進行某些控制,需要在COM 中加入兩個方法:

VIEw -> Type Library 顯示接口窗口。

右鍵 IPcSQL(具體根據設置名不同而不同) -> New ->建立兩個方法(Method):

GetDatabaseNames ,用以傳下別名數據,其接口信息為:

Return type :HRESULT

Parameters

name type modifIEr

Param1 VARIANT* [out,retval]

SetDatabaseName 
, 用以接受客戶機來的信息,其接口信息要求傳入

三個信息(注意:圖上的SetDatabaseName誤為SetDatabaseNames,實際請設為SetDatabaseName,否則客戶調用名稱可能會出錯)。

Return type :HRESULT

Parameters

name type modifIEr

DBName BSTR [in] ----
傳上來的別名

(用Add加入)

UserName BSTR [in]

PassWord BSTR [in]

刷新(Refresh Implementation)以後,就產生兩個函數

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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved