激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

分布式多層數據庫系統的應用(一)

時(shí)間:2024-06-27 18:51:54 計算機畢業(yè)論文 我要投稿
  • 相關(guān)推薦

分布式多層數據庫系統的應用(一)

摘要
 
本次畢業(yè)設計任務(wù)是通過(guò)開(kāi)發(fā)一個(gè)分布式多層數據庫圖書(shū)管理系統,學(xué)習用delphi開(kāi)發(fā)分布式多層數據庫系統。采用Delphi6.0和MS Server2000等軟件為開(kāi)發(fā)工具;通過(guò)對計算機硬件和軟件解決方案的論證;對應用領(lǐng)域進(jìn)行調查分析;參考各種資料和進(jìn)行數據庫編程實(shí)踐。在指導老師的幫助下,已經(jīng)基本上成功地實(shí)現了設計任務(wù)書(shū)的要求。使得設計的數據庫系統能夠實(shí)現一般數據庫的管理。我們研究了數據庫的查詢(xún)優(yōu)化問(wèn)題。

 第一部分  引 言
 
1.1任務(wù)或問(wèn)題:
 開(kāi)發(fā)一個(gè)分布式多層圖書(shū)管理系統,可以實(shí)現動(dòng)態(tài)的連接應用程序服務(wù)器,只要對配置文件進(jìn)行配置,就可以像網(wǎng)上鄰居一樣選擇所要連接的應用程序服務(wù)器。并提供借書(shū)還書(shū),圖書(shū)和期刊檢索等查詢(xún)功能。
1.2實(shí)際背景:
 隨著(zhù)社會(huì )發(fā)展,人類(lèi)的生產(chǎn)、生活越來(lái)越離不開(kāi)信息。誰(shuí)擁有了更多更有效的信息,誰(shuí)就將在競爭中處于有利地位。信息產(chǎn)業(yè)正在成為一個(gè)國家的支柱。數據作為信息的載體,其管理工具數據庫對于信息技術(shù)的重要性,正日益得到人們的重視。只有擁有了先進(jìn)的數據庫技術(shù),才能有效地管理好浩如煙海的數據,并從中提取出對自己有用的信息來(lái)加以利用。
 90年代,人們開(kāi)發(fā)MIS系統大都采用客戶(hù)機/服務(wù)器結構,客戶(hù)機/服務(wù)器結構既是硬件結構又是軟件結構。即數據放在服務(wù)器上,程序在客戶(hù)機上。進(jìn)行數據訪(fǎng)問(wèn)時(shí),由客戶(hù)機提出請求(一般是SQL語(yǔ)句),服務(wù)器執行并給出結果?蛻(hù)機/服務(wù)器對于優(yōu)化了網(wǎng)絡(luò ),提高了系統的利用率?蛻(hù)機/服務(wù)器體系結構的發(fā)展經(jīng)歷了從二級體系結構模式到三級體系結構模式。
1.3我的工作
    設計系統框架,設計數據庫,編寫(xiě)代碼,測試數據等。
1.4特色(創(chuàng )新)
 可以像網(wǎng)上鄰居一樣選擇所要連接的應用程序服務(wù)器。
 
 第二部分 畢業(yè)設計課題
 
設計課題
 漳大圖書(shū)館管理系統
設計時(shí)間
 二○○四年10月至二○○四年12月
設計人員及任務(wù)
 王東凱  動(dòng)態(tài)連接服務(wù)器模塊的實(shí)現及幫助件功能模塊的實(shí)現
 王開(kāi)斌  分布式多層數據模塊的實(shí)現
 王杰林  圖書(shū)管理功能模塊的實(shí)現
 陳慶輝  sqlserver 2000數據庫的分析及表的設計
指導老師
 蘇綠園
設計內容
 利用Delphi6.0和MS Server2000為主要開(kāi)發(fā)工具,以WindowsXP為開(kāi)發(fā)平臺。設計出分布式多層應用的圖書(shū)館管理系統?梢詫(shí)現動(dòng)態(tài)的連接應用程序服務(wù)器,只要對配置文件進(jìn)行配置,就可以像網(wǎng)上鄰居一樣選擇所要連接的應用程序服務(wù)器。實(shí)現與應用程序服務(wù)器快速而準確的連接。
 
 第三部分 系統方案論證
 
3.1軟件定義 
    數據庫設計所要的解決的問(wèn)題是:對于一個(gè)給定的應用領(lǐng)域,設計優(yōu)化的數據庫邏輯和物理結構,使之滿(mǎn)足用戶(hù)的信息管理要求和數據操作要求,有效地支持各種應用系統的開(kāi)發(fā)和運行。數據庫設計的目標是為用戶(hù)和各種應用系統提供一個(gè)高效的運行環(huán)境。而數據庫的設計可以視為如下的優(yōu)化問(wèn)題。
計算機的軟硬件環(huán)境;
數據庫管理系統的能力;
用戶(hù)的操作要求與信息要求;
完整性和安全性約束。
3.2 體系結構規劃
 本次設計的系統采用 三層″客戶(hù)/服務(wù)器″體系,為了便于理解,我們先從二層″客戶(hù)/服務(wù)器″體系結構來(lái)闡述:
 客戶(hù)/服務(wù)器是在網(wǎng)絡(luò )基礎上,以數據庫管理為后援,以計算機為網(wǎng)上工作站的一種系統結構。該結構的關(guān)鍵在把網(wǎng)絡(luò )環(huán)境上的數據庫存取和應用程序一分為二,分別由網(wǎng)上的數據庫服務(wù)器和網(wǎng)上客戶(hù)來(lái)執行。雖然本系統客戶(hù)/服務(wù)器是建立在LAN的基礎上,但它比以往的文件服務(wù)系統有了很大的改進(jìn)。首先,它消除了不必要的網(wǎng)絡(luò )傳輸負擔;其次,它可以使作為數據庫服務(wù)器的計算機被高度優(yōu)化,以適應數據處理的需要?蛻(hù)/服務(wù)器已經(jīng)能夠應用于復雜的網(wǎng)絡(luò )上,并使之能夠更有效地進(jìn)行選擇、檢索、索引排序等數據處理。作為一種高級的分布式計算機環(huán)境、客戶(hù)/服務(wù)器有足夠的能力把處理后的結果(不是整個(gè)文件)通過(guò)網(wǎng)絡(luò )傳輸出去,并根據用戶(hù)需求靈活地配置各種大、中、小型計算機系統。
3.3 系統設計
數據流圖
             
             管理要求                           查詢(xún)要求

              管理結果                          查詢(xún)結果


                                    (頂層數據流圖)
數據庫設計過(guò)程
 數據庫的設計過(guò)程如下圖所示。在數據庫設計過(guò)程中,需求分析和概念設計可以獨立于任何數據庫管理系統進(jìn)行。邏輯設計和物理設計與具體的數據庫管理系統密切相關(guān)。由于需求分析比較重要。我們在設計的時(shí)候,花了比較多的時(shí)間。在獲得這些資料之后,進(jìn)行分析。從中提取有用的部分。分析各種用戶(hù)的權限。
                          需求分析說(shuō)明書(shū)
     圖:數據庫設計過(guò)程
 
 第四部分 畢業(yè)設計內容
 
4.1分布式多層數據庫開(kāi)發(fā)簡(jiǎn)介
 Delphi提出的MIDAS(Multi-Tier distributed Application Services Suite多層分布式應用服務(wù)器組),是把原來(lái)Two- Tier數據連接放到了服務(wù)器端的COM組件上,客戶(hù)端只剩下了執行文件和MIDAS.DLL,前臺和服務(wù)器上的COM組件,通過(guò)DCOM機制互相溝通。
 這個(gè)多的一層,稱(chēng)為應用程序服務(wù)器(Application Server),或者稱(chēng)為中間件。整個(gè)工作機制見(jiàn)下圖:
 
 這種多層分布式工作機制,主要基于這樣幾點(diǎn)考慮:
減少客戶(hù)機的維護量,因為前臺程序比較簡(jiǎn)單;
 把企業(yè)邏輯封裝在通用的中間件應用服務(wù)器中,不同的客戶(hù)都可以共享同一個(gè)中間層(包括Web),而不必每個(gè)客戶(hù)都單獨實(shí)現企業(yè)規則,避免了重復開(kāi)發(fā)和維護的麻煩。由于客戶(hù)程序相當瘦(這就是現在流行的瘦客戶(hù)機概念),無(wú)論是開(kāi)發(fā)還是發(fā)布,都變得簡(jiǎn)單了。
便于升級,當中間件升級的時(shí)候,客戶(hù)程序可能不需要變化;
實(shí)現了分布式數據處理,把一個(gè)應用程序分布在幾臺機器上運行,可以提高應用程序的性能,也可以把敏感部分封裝在中間件,為不同的用戶(hù)設置不同的訪(fǎng)問(wèn)權限,增強了安全性。
減少直接連接數據庫的用戶(hù)數目,減少費用。
 在Delphi 6.0上,在原來(lái)的MIDAS基礎上,發(fā)展了DataSnap技術(shù),在很多細節方面,它提供了原來(lái)MIDAS所沒(méi)有的許多功能,使用上更加方便了。
 DataSnap主要提供客戶(hù)端和中間件之間的通信,不但支持COM+技術(shù)也支持TCP/IP或者CORBA,它們使用類(lèi)似的界面和方法,其結果由程序自動(dòng)完成,這就大大擴充了它的應用范圍。
 必須要提醒的是,前臺機器上除了應用程序以外,還必須把一個(gè)MIDAS.DLL文件復值到前臺機器上,這個(gè)文件在服務(wù)器的WINNT\System32目錄下。
 
4.2 服務(wù)器端程序的建立

    服務(wù)器端程序實(shí)際上是個(gè)COM 工程,它本身連接數據源,再通過(guò)接口與客戶(hù)端聯(lián)系,這個(gè)COM 工程必須注冊在服務(wù)器上。
 首先建立一個(gè)空白的工程,在工程里放置一個(gè)Adoconnection組件。然后再建一個(gè)遠程數據模塊file -> New -> Other -> Multitier -> Remote Data Module(遠程數據模塊)。   Coclass Name : libserver ,Instancing  :執行模式,大部分用Multiple Instance(多重實(shí)例),Threading Model:線(xiàn)程模式,建議用Apartment(單元),產(chǎn)生一個(gè)窗口,在這個(gè)窗口里,可以放入數據控件。
    在Viwe -> Type Libray 中,我們可以看到這個(gè)COM 的一些特性。我們也可以記下系統提供的GUID,以備后來(lái)使用。加入一個(gè)ADOTable,并設置其指向一個(gè)數據庫。再設置一個(gè)DataSetProvider(在DataAccess頁(yè))指向ADOTable,這就完成了服務(wù)器端的程序設計。
保存,編譯,注冊(注意,只要運行就自動(dòng)在本機注冊了)。

4.3 客戶(hù)端程序的建立

    在Two-Tier模式中,客戶(hù)端(Client)程序是直接和服務(wù)器的數據源相連的,而Multi-Tier模式,多個(gè)客戶(hù)端連接的是一個(gè)應用程序服務(wù)器,因為收費是按客戶(hù)端數計算的,所以,數據庫的使用費用比較低。
    1)建立一個(gè)普通的工程。   
 2)放置一個(gè)TDCOMConnrction控件(在Datasnap頁(yè)),屬性:在本機注冊時(shí),可直接設置以下屬性:ServerName:應用程序服務(wù)器注冊名(server.libserver)   ,Connected=true。這時(shí)你可以看到服務(wù)器端的COM 程序被激活了。如果在網(wǎng)絡(luò )上調試,需要給出服務(wù)器名:ComputerName:服務(wù)器名(自動(dòng)給出網(wǎng)上鄰居)注意: ServerGUID的GUID值是自動(dòng)給出的。
 3)放置一個(gè)TClientDataSet控件(在Data Access頁(yè)),屬性RemoteServer= DCOMConnrction1,ProviderName:=DataSetProvider1(服務(wù)器端將被激活),Active=true (激活后將能正常連接)
    4)放置TDataSource,屬性:Dataset:指向cdsCustomer。
 這樣一個(gè)客戶(hù)端程序就建立好了,其余猶如普通的數據庫設計。
 
4.4  客戶(hù)端實(shí)現SQL 查詢(xún)

    由于在客戶(hù)端不存在TQuery控件,似乎客戶(hù)服務(wù)器模式是無(wú)法做SQL查詢(xún)的。但是,Delphi很好的解決了這個(gè)問(wèn)題。事實(shí)上,只要客戶(hù)端連接上服務(wù)端應用程序,客戶(hù)端的TClientDataSet就包含了一個(gè)名字為Provider的屬性,對應到服務(wù)器端DataSetProvider的所有默認屬性和方法,其中DataSetProvider有一個(gè)Options屬性,只要讓其中的poAllowCommandText=true, 那么,DataSetProvider的poAllowCommandText就可以接受前臺來(lái)的SQL 命令,并傳送給TQuery。
    可以看出,真正傳遞數據的是DataSetProvider的接口,所以,用這個(gè)接口搭建傳遞SQL 的橋梁是必需的?蛻(hù)端進(jìn)行SQL 查詢(xún)的方法是:
      ClientDataSet.Close;
      ClientDataSet.CommandText := 'SQL語(yǔ)句';
 ClientDataSet.Open;
 
4.5 動(dòng)態(tài)連接應用程序服務(wù)器的實(shí)現
 
  客戶(hù)端程序在運行時(shí),需要連接應用服務(wù)器程序以取得服務(wù)。但是,在系統實(shí)際應用的時(shí)候,運行應用服務(wù)器程序的計算機是經(jīng)常改變的,因此在客戶(hù)端程序啟動(dòng)時(shí),應該先找到運行應用服務(wù)器程序的計算機的設置。動(dòng)態(tài)連接應用服務(wù)器的流程類(lèi)似于12.3節的動(dòng)態(tài)數據庫連接,動(dòng)態(tài)連接應用服務(wù)器程序的流程圖14-1所示。
 掌握了動(dòng)態(tài)連接應用服務(wù)器的流程,就可以具體實(shí)現它。下面就將分步驟介紹動(dòng)態(tài)連接應用服務(wù)器的實(shí)現過(guò)程。
在Delphi中新建一個(gè)窗體,將單元文件保存為connect.pas窗體的Name屬性設為fm_serconfig,Caption屬性設為”服務(wù)器配置”,運行后窗體如下圖所示。
 
 (2) 在“連接設置”窗體中,需要輸入應用服務(wù)器主機名(或者應用服務(wù)器IP地址)和應用服務(wù)器的端口號,這些配置信息將用來(lái)連接應用服務(wù)器。如果連接成功,輸入的配置信息將被寫(xiě)入到注冊表中,以后程序啟動(dòng)時(shí),讀取注冊表配置信息,就可而已連接應用服務(wù)器程序了。程序的具體實(shí)現部分如程序清單如下所示。
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure WriteToReg(const bappHost,bappIp,aPort:string);
{ Private declarations }
public
{ Public declarations }
end;
var
   fm_SerConfig: Tfm_SerConfig;  Connected: boolean= false;   //代表是否連接成功
 implementation
 uses netlist, data;
 {$R *.dfm}
 procedure Tfm_SerConfig.BitBtn1Click(Sender: TObject);
 begin
    if ((Edt_host.Text='') or (Edt_host.Text=null))
       and((Edt_ip.Text='') or (Edt_host.Text=null)) then
    begin
    application.MessageBox('請輸入服務(wù)器和IP','輸入錯誤',
                      mb_iconinformation + mb_defbutton1);
    exit;
    end;
    try
      strtoint(edt_Port.text);
    except
       Application.MessageBox('請輸入正確的端口號', '輸入錯誤..', mb_iconinformation + mb_defbutton1);
      exit;
    end;
    statusbar1.Panels[0].Text:='正在連接服務(wù)器,pleale wait';
    statusbar1.Refresh;
    screen.Cursor:=crHourGlass;
    fm_data.Socket.Connected:=false;
    fm_data.Socket.Host:=edt_host.Text;
    fm_data.Socket.Address:=edt_ip.Text;
    fm_data.Socket.Port:=strtoint(edt_port.Text);
    try
      screen.Cursor:=crdefault;
      fm_data.Socket.Connected:=true;
      application.MessageBox('連接成功','圖書(shū)管理系統', mb_iconinformation + mb_defbutton1);
      connected:=true;
    except
      screen.Cursor:=crdefault;
      application.MessageBox('連接失敗','圖書(shū)管理系統',mb_iconinformation+mb_defbutton1);
      connected:=false;
    end;
 //連接成功向注冊表里寫(xiě)入應用服務(wù)器配置信息
   WriteToReg(edt_Host.Text, edt_IP.Text, edt_Port.Text);
   close;
 end;
 //利用可視化窗體來(lái)選擇計算機
 procedure Tfm_SerConfig.Button1Click(Sender: TObject);
 begin
 edt_ip.Clear;
 edt_host.Text:=   NetExecute(TFm_NetList);
 end;
 //把信息寫(xiě)入注冊表
 procedure Tfm_SerConfig.WriteToReg(const bappHost,bappIp,aPort:string);
 var
 reg:Tregistry;
 begin
   reg:=Tregistry.Create;
   reg.RootKey:=HKEY_LOCAL_MACHINE;
   if not reg.OpenKey('\Software\pz',false) then //如果可以創(chuàng )建目錄
   begin
   reg.CreateKey('\Software\pz');
   reg.OpenKey('\Software\pz',false);
   end;
   reg.WriteString('host',bapphost);
   reg.WriteString('ip',bappip);
   reg.WriteString('port',aport);
   reg.Free;
 end;
 end.
 打開(kāi)“連接設置”配置窗口,在打開(kāi)窗體之前,函數已經(jīng)將布爾變量Connected設為False,而在窗體被關(guān)閉之后,將返回Connected變量的值,根據布爾變量Connected的值可以判斷是否已經(jīng)連接上應用服務(wù)器。
 (3) 在連接設置主窗口中,我們?yōu)閼梅⻊?wù)器名提供了輔助錄入的方法,點(diǎn)擊應用服務(wù)器名編輯框右邊的省略號按鈕(Button1),將彈出一個(gè)瀏覽局域網(wǎng)計算機的對話(huà)框,以方便用戶(hù)選擇應用服務(wù)器所在的計算機。在此我們調用了一個(gè)NetExecute方法,它將返回用戶(hù)選中的計算機的主機名。這個(gè)方法是如何實(shí)現的呢?下面將介紹NetExecute方法的實(shí)現過(guò)程。
 在Delphi中新建一個(gè)窗體,將窗體單元文件保存為netlist .pas,窗體的Name屬性設為Fm_netlist。運行后窗體如下圖所示。
 
 在列舉網(wǎng)絡(luò )資源窗體中,將按照工作組以樹(shù)型目錄的形式顯示局域網(wǎng)中的計算機。程序的具體實(shí)現部分如下所示。
procedure FormActivate(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
  procedure getcomputername;
  procedure getgroupname;
  { Private declarations }
public
  { Public declarations }
end;
function NetExecute(aFormClass: TFormClass): string;
var
  fm_NetList: Tfm_NetList;
  node: Ttreenode;
  aComputerName : string;//全局變量,存儲選中的主機名
implementation
{$R *.dfm}
//打開(kāi)窗體,并返回選定的計算機
function NetExecute(aFormClass: TFormClass): string;
begin
  aComputerName := '';
  with aFormClass.Create(Application) do
  begin
    try
      showModal;
    finally
      free;
    end;
    result := aComputerName;
  end;
end;

procedure TFm_netlist.FormActivate(Sender: TObject);
begin
node:=treeview1.items.add(Treeview1.topitem, '整個(gè)網(wǎng)絡(luò )');
node.imageindex:=0;
treeview1.setfocus;
end;

procedure TFm_netlist.TreeView1Click(Sender: TObject);
begin
  if treeview1.Selected.Level=0 then
  begin
    if treeview1.Selected.Count=0 then
    //添加工作組名
    getgroupname();
  end;
  if treeview1.Selected.Level=1 then
  begin
    if treeview1.Selected.Count=0 then
    //添加計算機名
    getcomputername;
  end;
  if treeview1.Selected.Level=2 then
  bitbtn1.Enabled:=true
  else
  bitbtn1.Enabled:=false;
end;
//取得計算機名
procedure Tfm_netlist.getcomputername;
var
  NetResource: TNetResource;
  Buf: Pointer;
  Count, BufSize, Res: DWord;
  Ind: Integer;
  lphEnum: THandle;
  Temp: TNetResourceArray;
  groupname: string;
  my_node: Ttreenode;
  my_node_2: Ttreenode;
begin
  screen.Cursor := crHourGlass;
  statusbar.panels[0].text := '正在列舉組名...,請稍侯';
  statusbar.refresh;
  my_node := treeview1.Selected;
  groupname := treeview1.Selected.Text;
  FillChar(NetResource, SizeOf(NetResource), 0); //初始化網(wǎng)絡(luò )層次信息
  NetResource.lpRemoteName := @GroupName[1]; //指定工作組名稱(chēng)
  NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //類(lèi)型為服務(wù)器(工作組)
  NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
  NetResource.dwScope := RESOURCETYPE_DISK; //列舉文件資源信息
  //獲取指定工作組的網(wǎng)絡(luò )資源句柄
  Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
  if Res <> NO_ERROR then Exit; //執行失敗
  while True do //列舉指定工作組的網(wǎng)絡(luò )資源
  begin
    Count := $FFFFFFFF; //不限資源數目
    BufSize := 8192; //緩沖區大小設置為8K
    GetMem(Buf, BufSize); //申請內存,用于獲取工作組信息
   //獲取計算機名稱(chēng)
    Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
    if Res = ERROR_NO_MORE_ITEMS then break; //資源列舉完畢
    if (Res <> NO_ERROR) then Exit; //執行失敗
    Temp := TNetResourceArray(Buf);
    for Ind := 0 to Count - 1 do //列舉工作組的計算機名稱(chēng)
    begin
      //獲取工作組的計算機名稱(chēng),+2表示刪除"\\",如
      my_node_2 := treeview1.Items.AddChild(my_node, Temp^.lpRemoteName + 2);
      my_node_2.imageindex := 2;
      Inc(Temp);
    end;
  end;
  Res := WNetCloseEnum(lphEnum); //關(guān)閉一次列舉
  if Res <> NO_ERROR then exit; //執行失敗
  FreeMem(Buf);
  screen.Cursor := crDefault;
  statusbar.panels[0].text := '';
  statusbar.refresh;
end;

//獲取組名
procedure Tfm_NetList.GetGroupName;
var
  NetResource: TNetResource;
  Buf: Pointer;
  Count, BufSize, Res: DWORD;
  lphEnum: THandle;
  p: TNetResourceArray;
  i, j: SmallInt;
  NetworkTypeList: TList;
  my_node_1: Ttreenode;
begin
  statusbar.panels[0].text := '正在列舉域名...,請稍侯';
  statusbar.refresh;
  screen.Cursor := crHourGlass;
  NetworkTypeList := TList.Create;
  //獲取整個(gè)網(wǎng)絡(luò )中的文件資源的句柄,lphEnum為返回名柄
  Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
    RESOURCEUSAGE_CONTAINER, nil, lphEnum);
  if Res <> NO_ERROR then exit; //執行失敗
  //獲取整個(gè)網(wǎng)絡(luò )中的網(wǎng)絡(luò )類(lèi)型信息
  Count := $FFFFFFFF; //不限資源數目
  BufSize := 8192; //緩沖區大小設置為8K
  GetMem(Buf, BufSize); //申請內存,用于獲取工作組信息
  Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
  if (Res = ERROR_NO_MORE_ITEMS) //資源列舉完畢
    or (Res <> NO_ERROR) //執行失敗
    then Exit;
  P := TNetResourceArray(Buf);
  for I := 0 to Count - 1 do //記錄各個(gè)網(wǎng)絡(luò )類(lèi)型的信息
  begin
    NetworkTypeList.Add(p);
    Inc(P);
  end;
  //WNetCloseEnum關(guān)閉一個(gè)列舉句柄
  Res := WNetCloseEnum(lphEnum); //關(guān)閉一次列舉
  if Res <> NO_ERROR then exit;
  for J := 0 to NetworkTypeList.Count - 1 do //列出各個(gè)網(wǎng)絡(luò )類(lèi)型中的所有工作組名稱(chēng)
  begin //列出一個(gè)網(wǎng)絡(luò )類(lèi)型中的所有工作組名稱(chēng)
    NetResource := TNetResource(NetworkTypeList.Items[J]^); //網(wǎng)絡(luò )類(lèi)型信息
  //獲取某個(gè)網(wǎng)絡(luò )類(lèi)型的文件資源的句柄,NetResource為網(wǎng)絡(luò )類(lèi)型信息,lphEnum為返回名柄
    Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
      RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
    if Res <> NO_ERROR then break; //執行失敗

    while true do //列舉一個(gè)網(wǎng)絡(luò )類(lèi)型的所有工作組的信息
    begin
      Count := $FFFFFFFF; //不限資源數目
      BufSize :=8192; //緩沖區大小設置為8K
      GetMem(Buf, BufSize); //申請內存,用于獲取工作組信息
              //獲取一個(gè)網(wǎng)絡(luò )類(lèi)型的文件資源信息,
      Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
      if (Res = ERROR_NO_MORE_ITEMS) //資源列舉完畢
        or (Res <> NO_ERROR) //執行失敗
        then break;
      P := TNetResourceArray(Buf);
      for I := 0 to Count - 1 do //列舉各個(gè)工作組的信息
      begin
        my_node_1 := treeview1.Items.addchild(node, StrPAS(P^.lpRemoteName)); //取得一個(gè)工作組的名稱(chēng)
        my_node_1.imageindex := 1;
        Inc(P);
      end;
    end;
    Res := WNetCloseEnum(lphEnum); //關(guān)閉一次列舉
    if Res <> NO_ERROR then break; //執行失敗
  end;
  FreeMem(Buf);
  NetworkTypeList.Destroy;
  screen.Cursor := crDefault;
  statusbar.panels[0].text := '';
  statusbar.refresh;
end;
procedure TFm_netlist.BitBtn1Click(Sender: TObject);
begin
  aComputerName := treeview1.Selected.Text;
  close;
end;
end.
 在上面的程序清單中,首先定義了NetExecute方法,它根據傳遞進(jìn)來(lái)的TFormClass參數值TformNet,打開(kāi)“列舉網(wǎng)絡(luò )資源”窗口,用戶(hù)可以在此窗口中選擇想要連接的運行應用服務(wù)器程序的計算機。NetExecute方法將返回選中的計算機主機名。
 在程序清單中,還自定義了GetGroupName和GetComputerName這兩個(gè)非常重要的過(guò)程,其中GetGroupName方法用于獲取網(wǎng)絡(luò )中所有的工作組名稱(chēng),并將工作組名添加到目錄樹(shù)的第二級目錄中;GetComputerName方法則根據工作組的名稱(chēng)窮舉工作組下的計算機,并將這些計算機添加到目錄樹(shù)的第三級目錄中。
 選擇好計算機后,單擊“確定”按鈕,系統將把選定的計算機主機名賦給aComputerName全局變量,此時(shí)在NetExecute方法中,便返回此值。
 (4) 在data單元(data.pas)中定義connect_app方法。connect_app方法用語(yǔ)讀取注冊表中配置應用服務(wù)器的信息并測試連接,如果沒(méi)有連接上應用程序服務(wù)器將從新彈出配置窗口。這個(gè)接口方法在程序主窗體創(chuàng )建時(shí)被調用,用以嘗試連接應用服務(wù)器。
 ConnectAppServ方法在interface中的具體定義為:
function TFm_data.connect_app: boolean; //判斷是否連接上了應用服務(wù)器
var
  vs_Host, vs_Address, vs_Port: string;
  reg: TRegistry;
begin
  Result := True;
  reg := Tregistry.create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  socket.Connected := false;
  //讀取注冊表配置的應用服務(wù)器信息
  if Reg.OpenKey('\Software\pz', False) then  //如果注冊表有信息
  begin
    vs_Host := reg.ReadString('Host');
    vs_Address := reg.ReadString('ip');
    vs_Port := reg.readstring('Port');
    try
      //測試連接
        socket.Address := vs_Address;
        socket.Host := vs_Host;
        socket.Port := strtoint(vs_Port);
        socket.Connected := true;
      reg.closekey;
    except //未連接上,彈出配置窗口
      reg.closekey;
        try
            fm_SerConfig := Tfm_serconfig.create(self);
            fm_SerConfig.showmodal;
        finally
            fm_SerConfig.free;
        end;
    end;
  end
  else      //如果沒(méi)有信息 彈出配置窗口
  begin
     try
            fm_SerConfig := Tfm_SerConfig.create(self);
            fm_SerConfig.showmodal;
        finally
            fm_SerConfig.free;
        end;
  end;
end;
 在此過(guò)程里,將主要讀取鍵為“HKEY_LOCAL_MACHINE\SOFTWARE\PZ”目錄下的應用服務(wù)器主機名,應用服務(wù)器IP地址和端口號的值,然后將這些值賦給主窗體的SocketConnection組件以測試連接。如果連接成功就返回True值,如果連接失敗,將彈出“連接設置“窗口,用戶(hù)需要從新輸入應用服務(wù)器主機名,應用服務(wù)器IP地址和端口號。如果仍然連接失敗,就返回False值,表示連接失敗。
 (5) 動(dòng)態(tài)連接設置的最后一個(gè)步驟就是在主窗體被創(chuàng )建時(shí),調用第4步中自定義的Imyserver_autho方法,判斷應用程序是否連接上了應用服務(wù)器。如果連接成功,將進(jìn)入應用程序;如果連接失敗,將退出應用程序。
 至此,動(dòng)態(tài)連接應用服務(wù)器就做完了。

4.6  圖書(shū)管理功能的實(shí)現

 圖書(shū)管理系統需要滿(mǎn)足來(lái)自三方面的需求,這三個(gè)方面分別是圖書(shū)借閱者、圖書(shū)館工作人員和圖書(shū)館管理人員。圖書(shū)借閱者的需求是查詢(xún)圖書(shū)館所存的圖書(shū)、個(gè)人借閱情況及個(gè)人信息的修改;圖書(shū)館工作人員對圖書(shū)借閱者的借閱及還書(shū)要求進(jìn)行操作,同時(shí)形成借書(shū)或還書(shū)報表給借閱者查看確認;圖書(shū)館管理人員的功能最為復雜,包括對工作人員、圖書(shū)借閱者、圖書(shū)進(jìn)行管理和維護,及系統狀態(tài)的查看、維護并生成催還圖書(shū)報表。    圖書(shū)借閱者可直接查看圖書(shū)館圖書(shū)情況,如果圖書(shū)借閱者根據本人借書(shū)證號和密碼登錄系統,還可以進(jìn)行本人借書(shū)情況的查詢(xún)和維護部分個(gè)人信息。一般情況下,圖書(shū)借閱者只應該查詢(xún)和維護本人的借書(shū)情況和個(gè)人信息,若查詢(xún)和維護其他借閱者的借書(shū)情況和個(gè)人信息,就要知道其他圖書(shū)借閱者的借書(shū)證號和密碼。這些是很難得到的,特別是密碼,所以不但滿(mǎn)足了圖書(shū)借閱者的要求,還保護了圖書(shū)借閱者的個(gè)人隱私。    圖書(shū)館工作人員有修改圖書(shū)借閱者借書(shū)和還書(shū)記錄的權限,所以需對工作人員登陸本模塊進(jìn)行更多的考慮。在此模塊中,圖書(shū)館工作人員可以為圖書(shū)借閱者加入借書(shū)記錄或是還書(shū)記錄,并打印生成相應的報表給用戶(hù)查看和確認。    在本系統中由于沒(méi)有打印機設備供試驗,所以沒(méi)有制作打印模塊。本系統提供的功能有    1. 設計不同用戶(hù)的操作權限和登陸方法    2. 對所有用戶(hù)開(kāi)放的圖書(shū)查詢(xún)    3. 借閱者維護借閱者個(gè)人部分信息    4. 借閱者查看個(gè)人借閱情況信息    5. 維護借閱者個(gè)人密碼     6. 查詢(xún)及統計各種信息    7 . 維護圖書(shū)信息     8. 維護借閱者信息     9. 對借閱過(guò)期的圖書(shū)進(jìn)行通知
 
 第五部分 畢業(yè)設計心得體會(huì )及結論
 
 在蘇綠園老師的指導下。本次畢業(yè)設計,就要畫(huà)上一個(gè)句號了?墒,對我來(lái)說(shuō),這次設計的本身所產(chǎn)生的影響,還遠遠沒(méi)有結束,我從本次畢業(yè)設計中學(xué)到了許多課本上沒(méi)有的知識。從設計任務(wù)書(shū)的下達到今天基本實(shí)現任務(wù)書(shū)中的設計要求,時(shí)間已整整過(guò)去了兩個(gè)月。在這兩個(gè)月中。通過(guò)自己的學(xué)習和努力;通過(guò)各位老師的指導和教育,使我不僅僅在知識水平和解決實(shí)際問(wèn)題的能力上有了很大的提高。還從思想的深處體會(huì )到,要把自己的所學(xué)變成現實(shí)時(shí)所將面對的種種難題。
 由于我平時(shí)的課程理論知識學(xué)的還可以,我總是認為自己的知識水平已經(jīng)能處理許多的現實(shí)問(wèn)題了。而當自己真正的深入到設計實(shí)踐當中,深入到問(wèn)題當中時(shí)。我竟然發(fā)現自己無(wú)從下手,我開(kāi)始懷疑我是否真正的學(xué)到了知識。也只有到了那個(gè)時(shí)候,我才真正體會(huì )到學(xué)會(huì )運用自己的能力與知識是何等的重要,知識是在課堂上,老師教授的,在書(shū)本中學(xué)到的,實(shí)踐則是要自己動(dòng)手,自己去做才能掌握。
 在老師們的關(guān)心和幫助下,我漸漸的開(kāi)始了設計。根據老師的建議,我找來(lái)了數據庫設計與建設的相關(guān)書(shū)籍和資料,從最基本的問(wèn)題入手開(kāi)始一個(gè)個(gè)的解決我心中的疑惑。 這是一個(gè)漫長(cháng)的學(xué)習過(guò)程。隨著(zhù)時(shí)間的推移,我開(kāi)始慢慢的掌握了設計時(shí)所需要的知識。我也終于明白了大學(xué)三年學(xué)習的意義和作用。扎實(shí)的基本功和良好的學(xué)習習慣,能使自己在學(xué)習新知識有更深刻的認識力和更快的領(lǐng)會(huì )力。
 同時(shí)老師對畢業(yè)設計的重視也是我能完成設計的一個(gè)重要條件。為了保證我們畢業(yè)設計的正常進(jìn)行,學(xué)院抽調了優(yōu)秀的老師指導我們進(jìn)行畢業(yè)設計,提供良好的設備給我們,在軟硬件上支持我們進(jìn)行畢業(yè)設計,并且不時(shí)地詢(xún)問(wèn)我們畢業(yè)設計的進(jìn)展情況。為我們這次設計的正常開(kāi)展提供了必要的物質(zhì)基礎。
關(guān)于本次設計的命題,我的設計只能提供其基本的功能。還有許多的設想由于時(shí)間和自身和因素無(wú)法得以實(shí)現,這不能不說(shuō)是本次設計的遺憾之處。不過(guò),至少它已經(jīng)啟發(fā)了自己的思維,提高了我的動(dòng)手能力,這是我在課本中學(xué)不到的。它為我們在以后的工作崗位上發(fā)揮自己的才能奠定了堅實(shí)的基礎。
              第六部分 附錄
6.1參考資料
《軟件工程》     陸惠恩 陸培恩 主編        電子工業(yè)出版社  2004年
《delphi高級程序員認證教材》  北京科海培訓中心       Delphi主講教師:謝新華
《SQL Server2000數據庫及應用基礎》徐人鳳 曾建華 主編  高等教育現版社 2004年
《Delphi 6深度編程及其應用開(kāi)發(fā)》  李存斌 汪兵 編著(zhù)  中國水利水電出版社   2002年

【分布式多層數據庫系統的應用(一)】相關(guān)文章:

分布式發(fā)電系統的應用及前景03-18

關(guān)于分布式發(fā)電系統的應用及前景11-23

分布式對象技術(shù)及其在Web上的應用03-18

PowerBuilder的分布式計算技術(shù)及其應用03-18

用RMI開(kāi)發(fā)基于Java的企業(yè)分布式應用03-19

談分布式防火墻技術(shù)及其應用03-18

多層螺旋CT不同成像方法在腦血管成像中的應用03-16

多層螺旋CT灌注成像在腦腫瘤中的應用研究03-18

分布式網(wǎng)絡(luò )化研究中心及其在靈敏制造中的應用03-22

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频