熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

DELPHI基礎教程:Delphi客戶服務器應用開發(三)[3]

2013-11-23 17:48:51  來源: Delphi編程 

   GetDatabaseNames方法

  聲明procedure GetDatabaseNames(List: TStrings)

  GetDatabaseNames方法清除List的內容並將所有BDE別名和應用程序定義的別名的名字寫入List

   GetDriverNames方法

  聲明procedure GetDriverNames(List: TStrings)

  GetDriverNames方法清除List中的內容並將BDE當前安裝的驅動程序名寫入List

   GetDriverParams方法

  聲明procedure GetDriverParams(const DriverName: String; List: TStrings)

  GetDriverParams方法消除List中的內容並將名為DriveName驅動程序缺省參數寫入List

   GetTableNames方法

  聲明procedure GetTableNames(const DatabaseName Pattern: Strings;

  Extensions SystemTable: Boolean; List: TStrings)

  GetTableNames方法消除List中的內容並將名為DatabaseName的數據庫中的所有表的名字寫入ListPattern參數將限制表名對於SQL服務器將SystemeTables設為True將獲取系統表和用戶表對非SQL數據庫將Extensions設為True將在表名中包含擴展名

   處理Client/Server事務控制

  使用隱式控制和顯示控制的數據庫應用中有兩種方法管理事務控制

  ● 運用TDatabase部件的屬性和方法進行顯式控制

  ● 運用TQuery部件的傳遞式SQL控制事務

  Delphi還支持Paradox和dBASE表的局部事務處理

   事務控制概述

  當用Delphi創建數據庫應用時Delphi提供了用為所有數據庫訪問的事務控制

  事務是這樣一組操作在被提交前它們對一個或多個數據庫的操作必須全部執行成功如果其中一個操作失敗則所有操作失敗即事務具有原子性

  即使發生硬件失敗事務也要保證數據庫一致性當允許多用戶並發訪問時事務還要維持數據完整性

  例如一個應用程序可能更新ORDERS表以指明接受購買某一項目的定單那麼也要更新INNENTORY表以反映庫存的減少如果在第一個更新之後第二個更新之前發生硬件錯誤數據庫就會處於不一致狀態因為庫存情況沒有反映定單情況在事務控制下兩個表達式將在同一時間提交如果其中一個表達式失敗則被返轉(Rolled Back)

   使用隱式控制

  在缺省情況下Delphi通過BDE為應用程序提供隱式事務控制當應用程序處於隱式事務控制時Delphi為DataSet中的寫每個記錄進行隱式事務控制它提交每一個獨立的寫操作如Post和Append Record

  使用隱式事務控制是容易的它保證最小的記錄更新沖突和數據庫的一致性視圖另一方面因為寫入數據庫的數據的每一行都要進行事務控制 所以隱式事務控制將導致網絡過忙和應用程序性能下降

  如果采用顯式事務控制就能選擇最有效的時機來開始提交和終止事務特別是在開發多用戶環境下的客戶應用程序運行訪問遠程SQL服務器就更應該采用顯式控制

   使用顯式事務控制

  有兩種協作又獨立的方式可運用於Delphi數據庫應用的事務控制

  ● 使用TDatabase部件的方法和屬性

  ● 使用TQuery部件中的傳遞式SQL這種方式只有在Delphi Client/Server Suite版中才有效SQL Links將SQL表達式直接傳給過程SQL或ODBC服務器

  使用TDatabase部件的方法和屬性的好處是提供了清晰的輕便的與特定數據庫或服務器無關的應用能力

  使用傳遞式SQL的主要好處在於可以運用特定服務器的先進事務管理能力

   使用TDatabase的方法和屬性

  下表中列出了TDatabase部件中用於事務管理的方法和屬性以及它們的使用方法

  表 TDatabase用於事務顯式控制的方法表

  ━━━━━━━━━━━━━━━━━━━━━━━━

  方法或屬性      作 用

  ────────────────────────

  Commit 提交數據的修改並終止事務

  Rollback 取消數據的修改並終止事務

  StartTransaction 開始一個事務

  TransIsolation 表述事務的獨立性級別

  ━━━━━━━━━━━━━━━━━━━━━━━━

  StartTransactionCommit和Rollback是供應用程序在運行時調用開始事務控制事務並且保存或放棄所做數據修改的方法

  TransIsolation是TDatabase部件的用於控制作用於相同表的不同事務之間如何交互的屬性

  ⑴ 開始一個事務

  當你開始一個事務時後來的所有讀寫數據庫的表達式都發生在那次事務的環境中每個表達式都是其中一部分任何表達式所做的修改要麼成功地提交給數據庫要麼每一個修改都被取消考慮一個在ATM上的銀行傳輸問題當顧客決定將錢從存款帳戶轉到支付帳戶時在銀行數據庫記錄上必須發生兩個修改

  ● 存款帳戶必須記入借方

  ● 支付帳戶必須記入貸方

  如果出於某種原因其中的一個操作不能被完成那麼任何一個操作都不應該發生因為這些操作是相關的它們應該發生在同一個事務中

  為了開始Delphi應用程序中的一個事務需要調用TDatabase部件中的StartTransaction方法

  DatabaseInterBaseStartTransaction;

  此後的所有數據操作都發生在最近一個事務的環境中直到該次事務通過調用Commit或Rollback顯式地終止為止

  那麼應當將事務保持多久呢?理想狀態下只要需要多久都行事務的活躍狀態越長同時訪問數據庫的用戶越多在你的事務的生命其中更多的並發同時的事務開始和終止於是當試圖提交修改時與其它事務沖突的可能性更大

  ⑵ 提交一個事務

  為了做永久性修改事務必須使用TDatabase部件的Commit方法提交執行提交表達式將保存數據庫的修改並終止事務例如下列表達式將終止在上例中開始的事務

  DatabaseInterBaseCommit

  Commit的調用應當置於try…except表達式中如果一個事務不能成功提交你就能處理錯誤並重試操作

  ⑶ 返轉一個事務

  為了取消數據庫修改必須用Rollback方法返轉一個事務Rollback 復原一個事務的修改並終止事務例如下列表達式將返轉一個事務

  DatabaseInterBaseRollback;

  Rollback通常發生在

  ● 異常處理代碼

  ● 按鈕或菜單事件代碼如用戶點按了Cancel按鈕

  ⑷ 使用TransIsolation屬性

  TransIsolation屬性描述TDatabase部件事務的獨立級別事務的獨立級別決定了事務與其它作用於相同表的事務是如何相互作用的在改變或設置TransIsolation 的值之前應當相當熟悉Delphi中的事務和事務管理

  TransIsolation的缺省值是tiReadCommitted下表中總結了TransIsolation的可能值並描述了它們的含義

  表 TransIsolation屬性值的含義

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  獨立級別         含 義

  ──────────────────────────────────────

  tiDirtyRead 允許讀由其它同時事務寫入數據庫的未提交的修改未提交的修改不是永久性的可能在任何時候被復原 在這個級別你的事務與其它事務所做的修改具有最低獨立度

  tiReadCommitted 只允許讀由其它同時事務提交的數據庫修改這是缺省的獨立級別

    iRepeatableRead 允許單個的數據庫讀事務無法看見其它同時事務對相同數據做的修改這個獨立級別保證了你的事務一次讀一個記錄記錄的視圖不會改變 在這個級別你的事務與其它事務做的修改完全獨立

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  各種數據庫服務器不同程度地支持這些獨立級別有的根本不支持 如果請求的隔離級別不被服務器支持Delphi將采用更高的獨立級別各種服務器支持的獨立級別請參見表

  如果應用程序使用ODBC與服務器交互ODBC驅動程序必須支持獨立級別

   使用傳遞式SQL

  為了能使用傳遞式SQL控制事物必須

  ● 使用Delphi Client/Server Suite

  ● 安裝正確的SQL Links驅動程序

  ● 正確配置網絡協議

  ● 訪問遠程服務器上數據庫的能力

  ● 用BDE配置工具將SQLPASSTHROUGH MODE設置為NOT SHARED

  通過傳遞式SQL你可以使用TQueryTStoredProc或TUpdateSQL部件直接發送一個SQL事務控制表達式給遠程數據庫服務器BDE本身並不處理SQL表達式采用傳遞式SQL可使用戶直接獲得SQL服務器提供了事務控制優點尤其是當那些控制是非標准的時

  SQL PASS THROUGHMODE 描述BDE和傳遞式SQL是否共享相同的數據庫聯接在大多數情況下SQLPASSTHROUGHMODE被設置SHARED AUTOCOMMIT然而如果你想將SQL事務控制傳遞給服務器你就必須用BDE配置工具將BDE的SQLPASSTHROUGHMODE 設置為NOT SHARED此外還必須為傳遞SQL事務控制表達式的TQuery部件建立獨立的TDatabase 部件

   使用本地事務

  BDE還支持Paradox和dBASE上的本地事務從代碼角度而言在本地事務和遠程數據庫服務器的事務之間沒有什麼差別

  當作用於本地數據庫表的事務開始時更新操作被記錄在日志中每個日志記錄包含舊的記錄緩沖區當事務處於活躍狀態更新的記錄被鎖定直到事務被提交或返轉在返轉過程中舊的記錄被應用於將更新的記錄恢復到原先的狀態

   使用存儲過程

   TStoredProc部件概述

  存儲過程是以數據庫服務器為基礎的接受輸入參數並將結果返回給應用程序的一段程序TStoredProc部件操作遠程服務器上的數據庫中的存儲過程存儲過程是一連串表達式的集合作為服務器的一部分存儲存儲過程在服務器上執行一系列重復性的與數據庫相關的任務並將結果傳給客戶應用程序如Delphi數據庫應用程序

  TStaredProc部件使Delphi數據庫應用程序能執行服務器上的存儲過程

  通常作用於數據庫表中大量記錄並且使用統計或數學函數的操作都是存儲過程的首選對象通過將這些重復計算任務轉移到服務器可以提高數據庫應用程序的性能

  ● 充分利用服務器的處理能力和速度

  ● 減少網絡傳輸的數量

  例如考慮一個需要計算單個值的應用程序在大批記錄中的標准差值如果在Delphi應用程序中執行這項功能就必須從服務器中得到所有在計算中用到的記錄這必將導致網絡擁塞因為應用程序所需的只是代表標准差的最終返回值因此由服務器上的存儲過程來讀數據執行計算和將值傳給應用程序將更有效

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25131.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.