後一頁
前一頁
回目錄
回首頁
第十八章 Delphi用戶伺服器應用開發(三)

3. 裝設的軟體項目

  當你裝設InterBase SQL Link驅動程式,下列項目將被裝設於你的工作站上。 

18.7 裝設的檔案標簽

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

   目        描

  ——————————————————————————————————————

  SQLD-IB.DLL 包含InterBase驅動程式和支援文件的動態鍊結庫

SQLINT32.DLL

  INTRBASE驅動型式  加在組態工具的驅動管理程式中以組態基本的Borland

InterBase SQL Link驅動程式

  INTRBASE別名型式  加入組態文件的別名以使建立聯接SQL伺服器資料庫的

別名

  SQLD_IB.HLP 組態InterBase驅動程式的輔助敘述文件

  READLINK.TXT Borland SQL Links for Windows自述文件

  INTERBAS.MSG InterBase訊息文件,通常裝設上C:\INTERBAS

CONNECT.EXE 測試工作站和InterBase伺服器連接情況的工具

  REMOTE.DLL InterBase的支援動態鍊結庫

  GDS.DLLGDS32.DLL

InterBase伺服器描述 裝設過程修改工作站的SERVICES文件以增加用於

  加入SERVICES文件  InterBase 伺服器存取所需的通訊協定描述

如:gds- db 3050/tcp

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

 

  軟體項目中還應包括TCP/IP接口軟體

  下表列出的文件給InterBase用戶端應用提供存取Winsock 1.1的接口

 

18.8 TCP/IP接口軟體

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

   名       描

  ————————————————————————————————

  MVWASYNC.EXE 異步通信模群組

   VSL.INT TCP/1P傳輸初始化文件

  WINSOCK.DLL Windows Socket動態鍊結庫

   MSOCKLIB.DLL Windows Socket呼叫映射到VSL驅動程式

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

 

  如果TCP/IP產品不是Winsock1.1相容,InterBase用戶端應用將也可採用其它TCP/1P 驅動程式。InterBase伺服器還可支援其它通信協定,如SPX/1PXNetBeIU等。

4. 解決一般的聯接問題

如果用SQL Links建立與InterBase伺服器的連接有問題可採用下列步驟來分離問題原因:

通過Windows ISQL工具測試能否與InterBase伺服器聯接

如果成功,狀態資訊會出現,並繼續步驟え。

如果不成功,詢問資料庫管理員。

檢驗InterBase SQL Links 驅動程式是否正確裝設。

重新裝設SQL Links

檢查SERVICES,文件中應有行:

 

gds_db 3050/tcp

 

如果不能正確裝設,就請詢問資料庫管理員,否則繼續步驟か。

測試底層通訊協定

輸入TELNET命令,確認TCP庫是否正確裝設。

如果TCP庫正確裝設,註冊提示符會出現。註冊入網檢查資料庫是否存在。

如果訊息是“can't resolve hostname 出現,檢查工作站的HOSTS文件是否有你 的主機名和IP位址的人口。如:

 

128.127.50.12 mis_server

 

如果用TELNET是成功的,但仍然無法正確聯接,則沒有正確裝設InterBase。請尋

求資料庫管理員的輔助敘述。

PING到伺服器伺服器上,測試InterBase伺服器是否正常執行並且為桌面應用可見

(如果PING是成功的,訊息“servername is alive”被顯示)

PING成功但TELNET不成功,則inet daemon可能有問題。

如果PING到伺服器上不成功,則有網路路徑問題,將問題報給網路管理員。

 

如果底層通訊協定不正常,請詢問資料庫管理員,否則繼續輔助敘述が。

確認是否有InterBase伺服器的存取權,如果有請繼續步驟き。

檢查BDE應用程式的InterBase別名是否正確裝設。

如果能夠直接從工作站上聯接,但不能從BDE應用程式中,那麼很有可能你的

IDAPI32.CFG別名設定有問題。執行BDE組態工具檢查InterBase別名。

 

 

18.3 Delphi Client/Server程式設計

 

  本節介紹如何運用Delphi可視化開發工具和ObjectPascal語言開發Client\Server的資料庫應用程式,採用的例子是CSDEMOS。這是Delphi2.0自帶的演示Client\Server開發的例子,它裝設在C:\Program Files\Borland\Delphi 2.0\Demos\DB\CSDemos(缺省裝設)

  本節將包含以下內容:

使用TDatabase部件連接SQL伺服器

  ● DataSet部件(又稱數據集部件),如TTableTQuery,聯接TDatabase部件並存取資料庫以及各種表之間如何切換

  ● 使用資料庫連接

  ● 觸發器的使用方法

  ● TStoredProc部件的使用方法

  ● 用戶和伺服器之間的事務控制

  ● TStoredProc部件的使用方法

 

18.3.1 使用TDatabase部件聯接SQL伺服器

 

18.3.1.1 TDatabase部件概述

 

  TDatabase部件處理應用程式與單個資料庫的聯接。如果不需要控制資料庫聯接,可以不用建立TDatabase部件。當應用程式試圖打開資料庫表(Table)時,會自動建立一個臨時的TDatabase部件。但如果你想控制資料庫的持續聯接、進入資料庫伺服器的註冊和資料庫別名的值或事務控制,那麼你就必須為每個所需的聯接建立一個TDatabase部件。

  1. 建立TDatabase部件

  TDatabase 部件在Component Palette中的Data Access頁上,你能將其拖放在數據模群組(Data module)或窗體中。在設計時建立TDatabase 部件,用戶可以設定初始值和編寫OnLogin事件處理過程(Event Handle)OnLogin事件給用戶提供了第一次註冊資料庫伺服器時定制伺服器安全參數,如密碼,的能力。

  2. TDatabase的關鍵屬性

DatabaseName屬性

DatabaseName是所要聯接的資料庫名,並且用於DataSet軟體,它將出現在DataSet部件的DatabaseName屬性的下拉式列示方塊中。設定DataBaseName屬性是定義資料庫應用的特定別名。DataSet部件能引用該名字以取代直接使用BDE別名。當TDatabase部件的Connected屬性為True時不能修改該屬性。

  え AliaName屬性

AliasNameBDE組態工具定義的BDE別名的名字。TDatabase 從中獲取其缺省的設定。如果設定DriveName屬性,則該屬性將被清除,如果當ConnectedTrue 時強行設定DriveName屬性將引發異常。

  ぉ DriveName屬性

DriveNameBDE驅動程式,如STANDARD ORACLESYBASEINFORMIXINTERBASE的名字。如果設定AliasName,則該屬性值將被清除。

  お Params屬性

Params屬性包含了打開SQL伺服器上資料庫時所需的參數。在缺省情況下,這些參數由BDE組態工具設定;用戶也可以用資料庫參數編輯器(Database Parameters Editor)修改這些參數。對於資料庫伺服器而言,Params將描述一系列的參數,如伺服器名、 資料庫名、用戶名和密碼。

  か Connected屬性

  Connected屬性指明是否建立資料庫的聯接,當應用程式打開資料庫中的一個表時Connected將被置為True;反之,關閉資料庫表,Connected將被置為False,除非KeepConnectionTrue。而將Connected置為True則可不需打開資料庫表即可建立資料庫聯接。TDatabaseKeepConnection屬性描述當資料庫中沒有表打開時是否維持資料庫聯連。

  が KeepConnection屬性

  KeepConnection屬性描述當資料庫中沒有打開表時是否要保持與伺服器的聯連, 如果資料庫應用需要打開和關閉單個資料庫中的多個表時,將KeepConnection 設定為True是很有用的,那樣,即使沒有打開任何表,應用仍能保持與資料庫的聯接,它能夠重複地打開和關閉資料庫表,而不需要重複執行聯接過程。如果KeepConnection置為False,當每次將Connected置為True,資料庫都必須執行註冊過程。

  き LoginPrompt屬性

  LoginPrompt屬性用於控制如何處理SQL資料庫的安全性問題。如置為True,當應用程式試圖建立資料庫聯接時螢幕上將出現標準Delphi註冊對話方塊。用戶必須輸入正確的用戶名和密碼。如果置為False,則應用程式將尋找TDatabase部件的Params 屬性中的註冊參數。下面是USERNAMEPASSWORD參數的例子:

 

  USERNAME = SYSDBA

PASSWORD = masterkey

 

  ?? TransIsolation屬性

  TransIsolation屬性描述SQL伺服器所有的事務控制獨立級別。 tiDirtyRead使所有修改都被返回,而不管記錄是否已被提交。tiReadCommitted將只返回提交的記錄,而提交的修改將不會在結果中反映出來。tiRepeatableRead 將只返回事務過程中最初的記錄,即使另一個應用程式將所作的修改提交。

  各種資料庫伺服器可能不同程度地支援這些獨立級別,或者根本不支援。 如果需要的獨立級別不被伺服器支援,那麼Dephi將使用下一個更高的獨立級別,如下表所示:

 

18.10 各類伺服器TransIsolation設定

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

  獨立級別     Oracle Sybase和     InterBase

Microsoft SQL

——————————————————————————————————————

Dirty Read Read Committed Read Committed Read Committed

Read Committed Read Committed Read Committed Read Committed

Repeatable read Repeatable read Not Supported Repeatable Read

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

 

各個獨立級別的含義請見表18.12

 

3. TDatabase的關鍵方法

  StartTransaction方法

  StartTransartion方法在由TaransIsolation屬性指定的獨立級別下開始事務控制。如果在一個事務已被動作的情況下呼叫該方法,Delphi將引發異常。

呼叫了該方法後,對資料庫所做的修改一直由資料庫伺服器維持到呼叫Commmit方法提交數據或呼叫Rollback方法取消修改為止。只有當聯接資料庫伺服器時,才能呼叫該方法。

  え Rollback方法

  Rollback方法返轉目前事務控制,並且取消自最近一次呼叫StartTransaction以來對資料庫所做的所有修改。

  ぉ Commit方法

  Commit方法提交目前事務控制,並且將自最近一次呼叫StartTransaction以來所有數據修改存入資料庫。

4. TDatabaseOnLogin事件的處理

  OnLogin事件的觸發條件是當聯接SQL資料庫的TDatabase部件被打開並且LoginPrompt屬性為True。使用OnLogin事件處理過程可以在執行時設定註冊參數。OnLogin 事件處理過程得到TDatabase的註冊參數數群群組Params,並且使用Values屬性改變這些參數。

  例如:

 

 LoginParams.Vaiues['SERVER NAME'] := 'MYSERVERNAME';

LoginParams.Values['USER NAME'] := 'MYUSERNAME';

LoginParams.Values[PASSWORD'] := 'MYAPSSWORD';

 

  當控制從OnLogin事件處理過程中返回時,應用程式用這些參數來建立聯接。

  OnLogin事件處理過程的聲明是這樣的:

 

  TLoginEvent = procedure(Database: TDatabase; LoginParam: TStrings) of Object;

property OnLogin: TLoginEvent;

 

TLoginEvent型式是處理OnLogin事件的方法頭。Database參數是要聯接的資料庫。LoginParamsTStrings型式的物件,包含用戶名和密碼,以及打開資料庫時所用的其它參數。用戶名是形如USER NAME = John.Doe的字元串,密碼是形如PASSWORD = is_Password的字元串。當OnLogin事件處理過程被呼叫時應當在LoginParams中加入用戶名和密碼。

 

18.3.1.2 定制資料庫伺服器的註冊參數

 

  大多數資料庫伺服器都包含限制資料庫存取的安全特征。通常,在用戶能存取資料庫之前,伺服器都要求註冊的用戶名和密碼。

  如果伺服器需要註冊,在設計階段,Delphi 會在你試圖聯接時提示你,諸如在會TTable部件描述資料庫表名時。

  在缺省情況下,Delphi應用在打開資料庫伺服器的聯接時,顯示標準註冊對話方塊。如果聯接已建立,則註冊對話方塊不會出現。

  可以用下列方法處理伺服器註冊:

1. TDatabase部件的LoginPrompt屬性置為True。這樣,當應用程式試圖建立資料庫聯接時,標準註冊對話方塊會打開。

   2. LoginPrompt屬性置為False,在TDatabase部件的Params屬性中包含用戶名和密碼參數。例如:

 

   USERNAME = SYSDBA

PASSWORD = mosterkey

 

但不推薦使用該方法,因為這會危害資料庫安全

  3. 使用TDatabase部件的OnLogin事件設定註冊參數。OnLogin事件得到TDatabase 註冊參數數群群組的拷貝,並利用Values屬性改變這些參數。如:

 

   LoginParams.Values['SERVER NAME'] := 'MYSERVERNAME';

   LoginParams.Values['USER NAME'] := 'MYUERNAME';

   LoginParams.Values['PASSWORD'] := 'MYPASSWORD';

 

  當控制從資料庫註冊事件處理過程中返回時,這些參數被用來建立聯接。

 

18.3.1.3 建立應用程式特定的別名

 

  TDatabaseAliases描述了資料庫表的位置和資料庫伺服器的聯接參數。通常都是在Delphi之外,運用BDE組態工具(BDECFG32.EXE)建立別名,並且別名被存在BDE 組態文件IDAPI32.CFG中。

  用戶也可以用TDatabase建立只在應用程式中可用的別名,用TDatabase 建立的別名不會加進BDE組態文件中。任何DataSet部件可通過描述DatabaseName 屬性來使用這些別名。為了定制這些局部別名的參數,用滑鼠左鍵連續按兩下TDatabase部件或從TDatabase部件中選擇Database EditorDelphi就會打開資料庫屬性編輯器(Database Properties Editor)

 

18.3.1.4 控制資料庫的聯接

 

  TDatabase部件的Connected屬性,指示TDatabase部件是否建立與資料庫伺服器的聯接。當應用程式打開資料庫中的表時,Connected被設定為True。將Connected 設為True就建立了資料庫的聯接。

  1. 保持資料庫聯接

  TDatabaseKeepConnection屬性描述當沒有資料庫表打開時是否要與保持資料庫的聯接。

  如果應用程式需要在單個資料庫中多次打開關閉多個表時,將KeepConnection 置為True能使應用程式具備更好的性能。

  當KeepConnectionTrue時,即使沒有表打開,應用程式也能保持資料庫的聯接。那麼就能重複打開和關閉資料庫表而不需每次進行聯接註冊。

  2. 使用TSesstion控制聯接

 TSesstion部件有一個面向整個應用程式的KeepConnections屬性。如果Session.KeepConnectionsTrue,那麼用於所有TDatabase部件的資料庫聯接都是持久的。

  TSession為應用程式提供資料庫聯接的全局控制。TSession中的Databases 屬性是Session中所有活躍資料庫群群組成的數群群組,DatabasesCount屬性描述活躍資料庫的數目。

  3. 描述NetPrivate目錄

  TSessionNetFileDir屬性描述BDE網路控制目錄的路徑。TSessionPrivateDir屬性描述存儲諸述處理局部SQL表達式的臨時文件的目錄的路徑。

 

18.3.1.5 獲取資料庫資訊

 

  TSession擁有許多讓用戶獲取資料庫有關的資訊,每個方法都以TStringList 部件作為傳入參數,並將資訊返回TStringList中。

  1. GetAliasNames方法

  聲明:procedure GetAliasNames(List: TStringList);

  GetAliasNames方法消除List中的參數,並將所有已定義的BDE別名的名字寫入List。應用程式產生的別名不包括在內。

  2. GetAliasParams方法

  聲明:procedure GetAliasParams(const AliasName: String; List: TStringList);

GetAliasParams方法清除List的內容,並將BDE別名為AliaName的參數寫入List

  3. GetDatabaseNames方法

  聲明:procedure GetDatabaseNames(List: TStrings);

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

4. GetDriverNames方法

  聲明:procedure GetDriverNames(List: TStrings);

  GetDriverNames方法清除List中的內容,並將BDE目前裝設的驅動程式名寫入List

  5. GetDriverParams方法

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

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

  6. GetTableNames方法

  聲明:procedure GetTableNames(const DatabaseName, Pattern: Strings;

Extensions, SystemTable: Boolean; List: TStrings);

  GetTableNames方法消除List中的內容,並將名為DatabaseName的資料庫中的所有表的名字寫入ListPattern參數將限制表名。對於SQL伺服器,將SystemeTables設為True將獲取系統表和用戶表。對非SQL資料庫,將Extensions設為True將在表名中包含檔案附加名。

 

18.3.2 處理Client/Server事務控制

 

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

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

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

 

  Delphi還支援ParadoxdBASE表的局部事務處理

 

18.3.2.1 事務控制概述

 

  當用Delphi建立資料庫應用時,Delphi提供了用為所有資料庫存取的事務控制。

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

  即使發生硬體失敗,事務也要保證資料庫一致性。當允許多用戶並發存取時,事務還要維持數據完整性。

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

 

18.3.2.2 使用隱式控制

 

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

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

  如果採用顯式事務控制,就能選擇最有效的時機來開始、提交和終止事務,特別是在開發多用戶環境下的用戶應用程式執行存取遠端SQL伺服器,就更應該採用顯式控制。

 

18.3.2.3 使用顯式事務控制

 

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

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

  ● 使用TQuery部件中的傳遞式SQL。這種方式只有在Delphi Client/Server Suite版中才有效,SQL LinksSQL表達式直接傳給過程SQLODBC伺服器

 

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

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

  1. 使用TDatabase的方法和屬性

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

 

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

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

   方法或屬性     

  ————————————————————————

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

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

  StartTransaction 開始一個事務

  TransIsolation 表述事務的獨立性級別

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

 

  StartTransactionCommitRollback是供應用程式在執行時呼叫開始事務,控制事務並且存檔或放棄所做數據修改的方法。

  TransIsolationTDatabase部件的用於控製作用於相同表的不同事務之間如何互動的屬性。

  ぇ 開始一個事務

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

  ● 存款帳戶必須記入借方

  ● 支付帳戶必須記入貸方

 

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

  為了開始Delphi應用程式中的一個事務,需要呼叫TDatabase部件中的StartTransaction方法:

 

  DatabaseInterBase.StartTransaction;

 

此後的所有數據操作都發生在最近一個事務的環境中,直到該次事務通過呼叫CommitRollback顯式地終止為止。

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

  え 提交一個事務

  為了做永久性修改,事務必須使用TDatabase部件的Commit方法提交。執行提交表達式將存檔資料庫的修改並終止事務。例如,下清單達式將終止在上例中開始的事務:

 

  DatabaseInterBase.Commit

 

  Commit的呼叫應當置於tryexcept表達式中。如果一個事務不能成功提交,你就能處理錯誤,並重試操作。

  ぉ 返轉一個事務

  為了取消資料庫修改,必須用Rollback方法返轉一個事務。Rollback 復原一個事務的修改,並終止事務,例如:下清單達式將返轉一個事務:

 DatabaseInterBase.Rollback;

 

Rollback通常發生在:

  ● 異常處理代碼

 ● 按鈕或選擇表事件代碼,如用戶點按了Cancel按鈕

 

  お 使用TransIsolation屬性

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

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

 

18.12 TransIsolation屬性值的含義

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

   獨立級別         含

——————————————————————————————————————

  tiDirtyRead 允許讀由其它同時事務寫入資料庫的未提交的修改。未提交的

             修改不是永久性的,可能在任何時候被復原。 在這個級別你

             的事務與其它事務所做的修改具有最低獨立度。

  tiReadCommitted 只允許讀由其它同時事務提交的資料庫修改。這是缺省的獨

             立級別。

  tiRepeatableRead 允許單個的資料庫讀事務無法看見其它同時事務對相同數據做

的修改。這個獨立級別保證了你的事務一次讀一個記錄,記錄

的視圖不會改變, 在這個級別你的事務與其它事務做的修改完

全獨立。

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

 

  各種資料庫伺服器不同程度地支援這些獨立級別,有的根本不支援。 如果請求的隔離級別不被伺服器支援,Delphi將採用更高的獨立級別。各種伺服器支援的獨立級別請參見表18.10

如果應用程式使用ODBC與伺服器互動,ODBC驅動程式必須支援獨立級別。

  2. 使用傳遞式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組態工具,將BDESQLPASSTHROUGHMODE 設定為NOT SHARED。此外,還必須為傳遞SQL事務控制表達式的TQuery部件建立獨立的TDatabase 部件。

  3. 使用本地事務

  BDE還支援ParadoxdBASE上的本地事務。從代碼角度而言,在本地事務和遠端資料庫伺服器的事務之間沒有什麼差別。

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

 

18.3.3 使用存儲過程

 

18.3.3.1 TStoredProc部件概述

 

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

TStaredProc部件使Delphi資料庫應用程式能執行伺服器上的存儲過程。

  通常,作用於資料庫表中大量記錄並且使用統計或數學函數的操作都是存儲過程的首選物件。通過將這些重複計算任務轉移到伺服器,可以提高資料庫應用程式的性能。

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

 ● 減少網路傳輸的數量

 

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

  1. TSoredProc的關鍵屬性

  ぇ DatabaseName屬性

  DatabaseName屬性描述要存取的資料庫的名字。該屬性可以為:

  ● 已定義的BDE別名

  ● 本地型資料庫的目錄

  ● Local InterBase伺服器的目錄路徑和檔案標簽

  ● TDatabase定義的應用程式別名

 

  在改變DatabaseName之前要使用Close方法將Dataset部件置為非活躍狀態。

  え StoredProcName屬性

  StoredProcName屬性表示伺服器上的存儲過程名。Oracle伺服器允許多個具有相同名字的存儲過程。因此要設定Overload屬性來描述執行在Oracle伺服器上的存儲過程名。

  ぉ Overload屬性

  Oracle伺服器允許Oracle套裝軟體中存儲過程的重載。就是說具有相同名字的不同過程,設定Overload屬性用來描述執行在Oracle伺服器上的存儲過程。如果Overload值為零,則假定沒有重載,如果Overload1,則Delphi執行具有同名的第一個存儲過程;如果值為2,則執行第二個存儲過程。

  お Params屬性

  Params屬性包含傳給存儲過程的參數。

  2. 關鍵方法

  ぇ ParamByName方法

  聲明:function ParamByName(const Value: String): TParam;

ParamByName方法返回Params屬性中具有名為Value的元素值。一般用該方法在動態查詢中給參數賦值。

  え Prepare方法

  PrePare方法準備要執行的存儲過程,這允許伺服器載入存儲過程,否則準備處理異常。

  ぉ ExecProc方法

  ExecProc方法執行伺服器上的存儲過程。

  お Open方法

  Open方法打開DataSet部件,並將其置於瀏覽狀態。這相當於將Active屬性置為True。對於TStoredProc如果存儲過程返回一個結果集,則使用Open執行存儲過程。如果存儲過程返回單行,早使用ExecProc執行存儲過程。

 

18.3.3.2 TStoreProc使用方法

 

  1. 建立一個StoredProc部件

  為資料庫伺服器上的存儲過程建立一個TStoredProc部件的步驟如下:

  ぇ Component PaletteData Access頁選擇TStoredProc部件放在數據模群組上。

  え TStoredProc部件的DatabaseName屬性設定為存儲過程所在的資料庫名。

DatabaseName必須是BDE別名。

  ぉ TStoredProc部件的StoredProcName屬性設為所用的存儲過程名,或者從下拉式

列示方塊中選擇。

  お TStoredProc部件的Params屬性中描述輸入參數。可以使用參數編輯器來設定輸

入參數。參數編輯器也可讓用戶察看存儲過程返回給應用程式的值。

 

  2. 設定存儲過程的輸入參數,察看輸出結果參數

  許多存儲過程需要給它們傳入一系列的輸入參數,以確定處理什麼和怎樣處理,在Params屬性中描述這些參數。所描述的輸入參數的順序是很重要的,它由伺服器上的存儲過程來確定。在設計時,最容易和最安全的方法是激活TStoredProc參數編輯器,編輯輸入參數。參數編輯器以正確的次序列出輸入參數,讓你給它們賦值。

  要激活TStoredProc的參數編輯器:

選擇TStoredProc部件。

  按滑鼠右鍵激活加速選擇表(Speed Menu)

選擇Define Parameters

 

參數名列示方塊顯示過程的所有輸入,輸出和結果參數。有關輸入、輸出參數的資訊從伺服器中獲得。對於某些伺服器而方,參數資訊是不可存取的,如Sybase,在這種情況下,列示方塊是空的,因此必須自己按過程要求的順序增加輸入輸出參數。

  參數型式核對方塊中描述所選的參數是輸入、輸出,還是結果參數。如果伺服器支援參數可以既是輸入又是輸出。如果在列示方塊中增添參數,就必須設定參數型式。

  數據型式核對方塊,列出列示方塊中所選參數的數據型式。如果給列示方塊真善美參數,必須設定數據型式。

  在值編輯框中給輸入參數賦值。

  如果伺服器不傳遞存儲過程資訊給Delphi,則可以用Add按鈕給存儲過程增添參數。Delete按鈕則是將增添的參數解除,Clear按鈕將清除列示方塊中所有參數。

  設定完參數後,選擇OK按鈕。

 

  3. 在執行時建立參數和參數值

  在執行時建立參數,可直接存取Params屬性。Params屬性是參數字元串的數群群組。例如,下列代碼將編輯框的文本賦給數群群組的第一個字串:

 

  StaredProc1.Params[0].Asstring := Edit1.Text

 

  也能夠用ParamsByName方法通過名字存取參數:

 

  StoredProc1.ParamsByName('Company') Asstring := Edit1.Text;

 

  4. 準備和執行存儲過程

  要使用存儲過程還必須準備並執行它。可以有兩種方式準備一個存儲過程:

  在設計時,通過選擇參數編輯器的OK按鈕

  在執行時,通過呼叫TStoredProcPrepare方法

 

  例如,下面的代碼準備存儲過程的執行:

 

  StoredProc1.Prepare;

 

  要執行準備好的存儲過程,呼叫TStroedProc部件的ExecProc方法。下列代碼演示了準備和執行存儲過程:

 

   StoredProc1.Params[0] Asstring := Edit1.Text;

StoredProc1.prepare;

StoredProc1.ExecProc;

 

  當你執行一個存儲過程,它返回輸出參數或結果集,有兩種可能的返回型式:單個返回,如單值或值集,和一群結果集,返回很多值。

  5. 存取輸出參數和結果集

  存儲過程在輸出參數數群群組中返回值。如果伺服器支援返回值可以是單個結果或者結果集。

  在執行時存取存儲過程的輸出參數,可以索引Params屬性或者用ParamByName方法存取這些值。下清單達式都用輸出參數設定了編輯框的值:

 

  Edit1.Text := StoredProc1.Params[6].AsString;

   Edit1.Text := StoredProc1.ParamsByName('Contact').AsString;

 

  如果存儲過程返回結果集,則用標準數據相關控制存取和顯示值會更有用。

  在某些伺服器上如Sybase,存儲過程能象查詢語句那樣返回結果集,應用程式可以使用數據相關控制一顯示這些存儲過程的輸出。

  用數據相關控制顯示存儲過程返回結果的方法如下:

  ヾ DataSource部件放在數據模群組上。

 ゝ DataSource部件的DataSet屬性設定為接收數據的TStoredProc部件的名字。

  ゞ 將數據相關控制的DataSource屬性設為DataSource部件的名字。 

  這樣,當用於TStoredProc部件和Active屬性為True時,數據相關控制就能顯示從存儲過程返回的結果。 

18.3.4 從開發基台到伺服器的向上適化


後一頁
前一頁
回目錄
回首頁