亚洲AV日韩AⅤ综合手机在线观看,激情婷婷久久综合色,欧美色五月婷婷久久,久久国产精品99久久人人澡

  • <abbr id="uk6uq"><abbr id="uk6uq"></abbr></abbr>
  • <tbody id="uk6uq"></tbody>
  • 分布式多層數(shù)據(jù)庫(kù)系統(tǒng)的應(yīng)用(一)

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

    分布式多層數(shù)據(jù)庫(kù)系統(tǒng)的應(yīng)用(一)

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

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

                  管理結(jié)果                          查詢結(jié)果


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

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

    4.3 客戶端程序的建立

        在Two-Tier模式中,客戶端(Client)程序是直接和服務(wù)器的數(shù)據(jù)源相連的,而Multi-Tier模式,多個(gè)客戶端連接的是一個(gè)應(yīng)用程序服務(wù)器,因?yàn)槭召M(fèi)是按客戶端數(shù)計(jì)算的,所以,數(shù)據(jù)庫(kù)的使用費(fèi)用比較低。
        1)建立一個(gè)普通的工程。   
     2)放置一個(gè)TDCOMConnrction控件(在Datasnap頁(yè)),屬性:在本機(jī)注冊(cè)時(shí),可直接設(shè)置以下屬性:ServerName:應(yīng)用程序服務(wù)器注冊(cè)名(server.libserver)   ,Connected=true。這時(shí)你可以看到服務(wù)器端的COM 程序被激活了。如果在網(wǎng)絡(luò)上調(diào)試,需要給出服務(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è)客戶端程序就建立好了,其余猶如普通的數(shù)據(jù)庫(kù)設(shè)計(jì)。
     
    4.4  客戶端實(shí)現(xiàn)SQL 查詢

        由于在客戶端不存在TQuery控件,似乎客戶服務(wù)器模式是無(wú)法做SQL查詢的。但是,Delphi很好的解決了這個(gè)問(wèn)題。事實(shí)上,只要客戶端連接上服務(wù)端應(yīng)用程序,客戶端的TClientDataSet就包含了一個(gè)名字為Provider的屬性,對(duì)應(yīng)到服務(wù)器端DataSetProvider的所有默認(rèn)屬性和方法,其中DataSetProvider有一個(gè)Options屬性,只要讓其中的poAllowCommandText=true, 那么,DataSetProvider的poAllowCommandText就可以接受前臺(tái)來(lái)的SQL 命令,并傳送給TQuery。
        可以看出,真正傳遞數(shù)據(jù)的是DataSetProvider的接口,所以,用這個(gè)接口搭建傳遞SQL 的橋梁是必需的?蛻舳诉M(jìn)行SQL 查詢的方法是:
          ClientDataSet.Close;
          ClientDataSet.CommandText := 'SQL語(yǔ)句';
     ClientDataSet.Open;
     
    4.5 動(dòng)態(tài)連接應(yīng)用程序服務(wù)器的實(shí)現(xiàn)
     
      客戶端程序在運(yùn)行時(shí),需要連接應(yīng)用服務(wù)器程序以取得服務(wù)。但是,在系統(tǒng)實(shí)際應(yīng)用的時(shí)候,運(yùn)行應(yīng)用服務(wù)器程序的計(jì)算機(jī)是經(jīng)常改變的,因此在客戶端程序啟動(dòng)時(shí),應(yīng)該先找到運(yùn)行應(yīng)用服務(wù)器程序的計(jì)算機(jī)的設(shè)置。動(dòng)態(tài)連接應(yīng)用服務(wù)器的流程類似于12.3節(jié)的動(dòng)態(tài)數(shù)據(jù)庫(kù)連接,動(dòng)態(tài)連接應(yīng)用服務(wù)器程序的流程圖14-1所示。
     掌握了動(dòng)態(tài)連接應(yīng)用服務(wù)器的流程,就可以具體實(shí)現(xiàn)它。下面就將分步驟介紹動(dòng)態(tài)連接應(yīng)用服務(wù)器的實(shí)現(xiàn)過(guò)程。
    在Delphi中新建一個(gè)窗體,將單元文件保存為connect.pas窗體的Name屬性設(shè)為fm_serconfig,Caption屬性設(shè)為”服務(wù)器配置”,運(yùn)行后窗體如下圖所示。
     
     (2) 在“連接設(shè)置”窗體中,需要輸入應(yīng)用服務(wù)器主機(jī)名(或者應(yīng)用服務(wù)器IP地址)和應(yīng)用服務(wù)器的端口號(hào),這些配置信息將用來(lái)連接應(yīng)用服務(wù)器。如果連接成功,輸入的配置信息將被寫(xiě)入到注冊(cè)表中,以后程序啟動(dòng)時(shí),讀取注冊(cè)表配置信息,就可而已連接應(yīng)用服務(wù)器程序了。程序的具體實(shí)現(xiàn)部分如程序清單如下所示。
    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('請(qǐng)輸入服務(wù)器和IP','輸入錯(cuò)誤',
                          mb_iconinformation + mb_defbutton1);
        exit;
        end;
        try
          strtoint(edt_Port.text);
        except
           Application.MessageBox('請(qǐng)輸入正確的端口號(hào)', '輸入錯(cuò)誤..', 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ū)管理系統(tǒng)', mb_iconinformation + mb_defbutton1);
          connected:=true;
        except
          screen.Cursor:=crdefault;
          application.MessageBox('連接失敗','圖書(shū)管理系統(tǒng)',mb_iconinformation+mb_defbutton1);
          connected:=false;
        end;
     //連接成功向注冊(cè)表里寫(xiě)入應(yīng)用服務(wù)器配置信息
       WriteToReg(edt_Host.Text, edt_IP.Text, edt_Port.Text);
       close;
     end;
     //利用可視化窗體來(lái)選擇計(jì)算機(jī)
     procedure Tfm_SerConfig.Button1Click(Sender: TObject);
     begin
     edt_ip.Clear;
     edt_host.Text:=   NetExecute(TFm_NetList);
     end;
     //把信息寫(xiě)入注冊(cè)表
     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)“連接設(shè)置”配置窗口,在打開(kāi)窗體之前,函數(shù)已經(jīng)將布爾變量Connected設(shè)為False,而在窗體被關(guān)閉之后,將返回Connected變量的值,根據(jù)布爾變量Connected的值可以判斷是否已經(jīng)連接上應(yīng)用服務(wù)器。
     (3) 在連接設(shè)置主窗口中,我們?yōu)閼?yīng)用服務(wù)器名提供了輔助錄入的方法,點(diǎn)擊應(yīng)用服務(wù)器名編輯框右邊的省略號(hào)按鈕(Button1),將彈出一個(gè)瀏覽局域網(wǎng)計(jì)算機(jī)的對(duì)話框,以方便用戶選擇應(yīng)用服務(wù)器所在的計(jì)算機(jī)。在此我們調(diào)用了一個(gè)NetExecute方法,它將返回用戶選中的計(jì)算機(jī)的主機(jī)名。這個(gè)方法是如何實(shí)現(xiàn)的呢?下面將介紹NetExecute方法的實(shí)現(xiàn)過(guò)程。
     在Delphi中新建一個(gè)窗體,將窗體單元文件保存為netlist .pas,窗體的Name屬性設(shè)為Fm_netlist。運(yùn)行后窗體如下圖所示。
     
     在列舉網(wǎng)絡(luò)資源窗體中,將按照工作組以樹(shù)型目錄的形式顯示局域網(wǎng)中的計(jì)算機(jī)。程序的具體實(shí)現(xiàn)部分如下所示。
    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;//全局變量,存儲(chǔ)選中的主機(jī)名
    implementation
    {$R *.dfm}
    //打開(kāi)窗體,并返回選定的計(jì)算機(jī)
    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
        //添加計(jì)算機(jī)名
        getcomputername;
      end;
      if treeview1.Selected.Level=2 then
      bitbtn1.Enabled:=true
      else
      bitbtn1.Enabled:=false;
    end;
    //取得計(jì)算機(jī)名
    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 := '正在列舉組名...,請(qǐng)稍侯';
      statusbar.refresh;
      my_node := treeview1.Selected;
      groupname := treeview1.Selected.Text;
      FillChar(NetResource, SizeOf(NetResource), 0); //初始化網(wǎng)絡(luò)層次信息
      NetResource.lpRemoteName := @GroupName[1]; //指定工作組名稱
      NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //類型為服務(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; //執(zhí)行失敗
      while True do //列舉指定工作組的網(wǎng)絡(luò)資源
      begin
        Count := $FFFFFFFF; //不限資源數(shù)目
        BufSize := 8192; //緩沖區(qū)大小設(shè)置為8K
        GetMem(Buf, BufSize); //申請(qǐng)內(nèi)存,用于獲取工作組信息
       //獲取計(jì)算機(jī)名稱
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
        if Res = ERROR_NO_MORE_ITEMS then break; //資源列舉完畢
        if (Res <> NO_ERROR) then Exit; //執(zhí)行失敗
        Temp := TNetResourceArray(Buf);
        for Ind := 0 to Count - 1 do //列舉工作組的計(jì)算機(jī)名稱
        begin
          //獲取工作組的計(jì)算機(jī)名稱,+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; //執(zhí)行失敗
      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 := '正在列舉域名...,請(qǐng)稍侯';
      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; //執(zhí)行失敗
      //獲取整個(gè)網(wǎng)絡(luò)中的網(wǎng)絡(luò)類型信息
      Count := $FFFFFFFF; //不限資源數(shù)目
      BufSize := 8192; //緩沖區(qū)大小設(shè)置為8K
      GetMem(Buf, BufSize); //申請(qǐng)內(nèi)存,用于獲取工作組信息
      Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
      if (Res = ERROR_NO_MORE_ITEMS) //資源列舉完畢
        or (Res <> NO_ERROR) //執(zhí)行失敗
        then Exit;
      P := TNetResourceArray(Buf);
      for I := 0 to Count - 1 do //記錄各個(gè)網(wǎng)絡(luò)類型的信息
      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ò)類型中的所有工作組名稱
      begin //列出一個(gè)網(wǎng)絡(luò)類型中的所有工作組名稱
        NetResource := TNetResource(NetworkTypeList.Items[J]^); //網(wǎng)絡(luò)類型信息
      //獲取某個(gè)網(wǎng)絡(luò)類型的文件資源的句柄,NetResource為網(wǎng)絡(luò)類型信息,lphEnum為返回名柄
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
          RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
        if Res <> NO_ERROR then break; //執(zhí)行失敗

        while true do //列舉一個(gè)網(wǎng)絡(luò)類型的所有工作組的信息
        begin
          Count := $FFFFFFFF; //不限資源數(shù)目
          BufSize :=8192; //緩沖區(qū)大小設(shè)置為8K
          GetMem(Buf, BufSize); //申請(qǐng)內(nèi)存,用于獲取工作組信息
                  //獲取一個(gè)網(wǎng)絡(luò)類型的文件資源信息,
          Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
          if (Res = ERROR_NO_MORE_ITEMS) //資源列舉完畢
            or (Res <> NO_ERROR) //執(zhí)行失敗
            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è)工作組的名稱
            my_node_1.imageindex := 1;
            Inc(P);
          end;
        end;
        Res := WNetCloseEnum(lphEnum); //關(guān)閉一次列舉
        if Res <> NO_ERROR then break; //執(zhí)行失敗
      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ù)傳遞進(jìn)來(lái)的TFormClass參數(shù)值TformNet,打開(kāi)“列舉網(wǎng)絡(luò)資源”窗口,用戶可以在此窗口中選擇想要連接的運(yùn)行應(yīng)用服務(wù)器程序的計(jì)算機(jī)。NetExecute方法將返回選中的計(jì)算機(jī)主機(jī)名。
     在程序清單中,還自定義了GetGroupName和GetComputerName這兩個(gè)非常重要的過(guò)程,其中GetGroupName方法用于獲取網(wǎng)絡(luò)中所有的工作組名稱,并將工作組名添加到目錄樹(shù)的第二級(jí)目錄中;GetComputerName方法則根據(jù)工作組的名稱窮舉工作組下的計(jì)算機(jī),并將這些計(jì)算機(jī)添加到目錄樹(shù)的第三級(jí)目錄中。
     選擇好計(jì)算機(jī)后,單擊“確定”按鈕,系統(tǒng)將把選定的計(jì)算機(jī)主機(jī)名賦給aComputerName全局變量,此時(shí)在NetExecute方法中,便返回此值。
     (4) 在data單元(data.pas)中定義connect_app方法。connect_app方法用語(yǔ)讀取注冊(cè)表中配置應(yīng)用服務(wù)器的信息并測(cè)試連接,如果沒(méi)有連接上應(yīng)用程序服務(wù)器將從新彈出配置窗口。這個(gè)接口方法在程序主窗體創(chuàng)建時(shí)被調(diào)用,用以嘗試連接應(yīng)用服務(wù)器。
     ConnectAppServ方法在interface中的具體定義為:
    function TFm_data.connect_app: boolean; //判斷是否連接上了應(yīng)用服務(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;
      //讀取注冊(cè)表配置的應(yīng)用服務(wù)器信息
      if Reg.OpenKey('\Software\pz', False) then  //如果注冊(cè)表有信息
      begin
        vs_Host := reg.ReadString('Host');
        vs_Address := reg.ReadString('ip');
        vs_Port := reg.readstring('Port');
        try
          //測(cè)試連接
            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”目錄下的應(yīng)用服務(wù)器主機(jī)名,應(yīng)用服務(wù)器IP地址和端口號(hào)的值,然后將這些值賦給主窗體的SocketConnection組件以測(cè)試連接。如果連接成功就返回True值,如果連接失敗,將彈出“連接設(shè)置“窗口,用戶需要從新輸入應(yīng)用服務(wù)器主機(jī)名,應(yīng)用服務(wù)器IP地址和端口號(hào)。如果仍然連接失敗,就返回False值,表示連接失敗。
     (5) 動(dòng)態(tài)連接設(shè)置的最后一個(gè)步驟就是在主窗體被創(chuàng)建時(shí),調(diào)用第4步中自定義的Imyserver_autho方法,判斷應(yīng)用程序是否連接上了應(yīng)用服務(wù)器。如果連接成功,將進(jìn)入應(yīng)用程序;如果連接失敗,將退出應(yīng)用程序。
     至此,動(dòng)態(tài)連接應(yīng)用服務(wù)器就做完了。

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

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

    【分布式多層數(shù)據(jù)庫(kù)系統(tǒng)的應(yīng)用(一)】相關(guān)文章:

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

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

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

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

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

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

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

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

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