5. 訪問輸出參數(shù)和結(jié)果集
存儲過程在輸出參數(shù)數(shù)組中返回值。如果服務(wù)器支持返回值可以是單個結(jié)果或者結(jié)果集。
在運行時訪問存儲過程的輸出參數(shù),可以索引Params屬性或者用ParamByName方法訪問這些值。下列表達式都用輸出參數(shù)設(shè)置了編輯框的值:
Edit1.Text := StoredProc1.Params[6].AsString;
Edit1.Text := StoredProc1.ParamsByName('Contact').AsString;
如果存儲過程返回結(jié)果集,則用標(biāo)準(zhǔn)數(shù)據(jù)相關(guān)控制訪問和顯示值會更有用。
在某些服務(wù)器上如Sybase,存儲過程能象查詢語句那樣返回結(jié)果集,應(yīng)用程序可以使用數(shù)據(jù)相關(guān)控制一顯示這些存儲過程的輸出。
用數(shù)據(jù)相關(guān)控制顯示存儲過程返回結(jié)果的方法如下:
、 將DataSource部件放在數(shù)據(jù)模塊上。
、 將DataSource部件的DataSet屬性設(shè)置為接收數(shù)據(jù)的TStoredProc部件的名字。
、 將數(shù)據(jù)相關(guān)控制的DataSource屬性設(shè)為DataSource部件的名字。
這樣,當(dāng)用于TStoredProc部件和Active屬性為True時,數(shù)據(jù)相關(guān)控制就能顯示從存儲過程返回的結(jié)果。
18.3.4 從開發(fā)平臺到服務(wù)器的向上適化
18.3.4.1 適化概述
所謂適化就是將桌面應(yīng)用轉(zhuǎn)化為Client/Server應(yīng)用。
適化是一個很復(fù)雜的主題,這里不詳細講述。本節(jié)將介紹適化Delphi 應(yīng)用程序中最重要的方面。
適化的主要方面有:
● 將數(shù)據(jù)庫從桌面平臺到服務(wù)器的適化
● 將應(yīng)用程序轉(zhuǎn)化為Client/Server的適化
適化還需要實現(xiàn)從桌面環(huán)境到Client/Server環(huán)境的轉(zhuǎn)化。
桌面數(shù)據(jù)庫和SQL服務(wù)器數(shù)據(jù)庫在許多方面有不同之處。例如:
● 桌面數(shù)據(jù)庫用于同一時刻單用戶的訪問,而服務(wù)器用于多用戶訪問
● 桌面數(shù)據(jù)庫是面向記錄的,而服務(wù)器是面向集合的
● 桌面數(shù)據(jù)庫將每個表存儲在獨立的文件中, 而服務(wù)器將所有的表存儲在數(shù)據(jù)庫中Client/Server應(yīng)用必須解決更新的問題,最復(fù)雜的是聯(lián)接、網(wǎng)絡(luò)和事務(wù)控制
18.3.4.2 適化數(shù)據(jù)庫
適化數(shù)據(jù)庫包含下列步驟:
● 在桌面數(shù)據(jù)庫結(jié)構(gòu)的基礎(chǔ)上,定義服務(wù)器上的元數(shù)據(jù)
● 將數(shù)據(jù)從桌面轉(zhuǎn)化到服務(wù)器中
● 解決下列問題:
● 數(shù)據(jù)類型差異
● 數(shù)據(jù)安全性和完整性
● 事務(wù)控制
● 數(shù)據(jù)訪問權(quán)
● 數(shù)據(jù)合法性
● 鎖定
Delphi提供了兩種方法適化一個數(shù)據(jù)庫。
● 使用Database Desktop工具,選擇菜單Tools/Utilities/Copy to命令將數(shù)據(jù)庫表從桌面方式拷貝到SQL格式
● 建立應(yīng)用TBatchMove部件的應(yīng)用程序
這兩種方法都可以將表結(jié)構(gòu)和數(shù)據(jù)從桌面數(shù)據(jù)源轉(zhuǎn)化到服務(wù)器上。依靠這些數(shù)據(jù)庫,可能需要改變結(jié)果表。例如,可能想進行不同數(shù)據(jù)類型的映射。
也可以將下列特征加入數(shù)據(jù)庫:
● 完整性約束
● 索引
● 檢測約束
● 存儲過程和觸發(fā)器
● 其它服務(wù)器特征
如果用SQL腳本和服務(wù)器數(shù)據(jù)定義工具定義元數(shù)據(jù)會更有效。然后用前面介紹的兩種方法轉(zhuǎn)移數(shù)據(jù)。因為如果是手工定義數(shù)據(jù)庫表,Database Desktop和TBatchMove 部件將只拷貝數(shù)據(jù)。
18.3.4.3 適化應(yīng)用程序
在理論上,設(shè)計用來訪問局部數(shù)據(jù)的Delphi應(yīng)用程序做很少的修改就可以訪問遠程服務(wù)器上的數(shù)據(jù)。如果在服務(wù)器上定義適合的數(shù)據(jù)源,你就能將應(yīng)用程序指向訪問它,這只需簡單地改變應(yīng)用程序中TTable或TQuery部件的DatabaseName屬性。
實際上,在訪問局部和過程數(shù)據(jù)源之間有許多重要的不同之處。Client/Server應(yīng)用程序必須解決大量的在桌面應(yīng)用中所沒有的問題。
任何Delphi應(yīng)用程序都能用TTable或TQuery部件訪問數(shù)據(jù)。桌面應(yīng)用程序通常都是使用TTable部件。當(dāng)適化到SQL服務(wù)器上時,用TQuery會更有效,如果應(yīng)用程序要檢索大量記錄,則TQuery部件要略勝一籌。
如果應(yīng)用程序使用統(tǒng)計或數(shù)學(xué)函數(shù),那么在服務(wù)器上通過存儲過程執(zhí)行這些函數(shù)會更有效。因為存儲過程執(zhí)行更快,使用存儲過程還可以減少網(wǎng)絡(luò)負載,特別是大量行數(shù)據(jù)的函數(shù)。
例如,計算大量記錄的標(biāo)準(zhǔn)差:
● 如果該函數(shù)在客戶端執(zhí)行,所有的值從服務(wù)器上檢索出來并送到客戶端,導(dǎo)致網(wǎng)絡(luò)擁塞
● 如果該函數(shù)在服務(wù)器端執(zhí)行,則應(yīng)用程序只需要服務(wù)器上的答案
18.4 Delphi客戶/服務(wù)器應(yīng)用實例分析
本節(jié)中采用的實例是Delphi2.0數(shù)據(jù)庫的例子CSDEMO。CSDEMO是Delphi客戶/服務(wù)器編程的示例程序,它采用的數(shù)據(jù)庫服務(wù)器是Local InterBase Server。
CSDEMO較好地示范了BDE環(huán)境的配置,InterBASE Server高級功能應(yīng)用,SQL服務(wù)器聯(lián)接,觸發(fā)器應(yīng)用、存儲過程編程和事務(wù)控制技術(shù)等,具有較高的參考價值。本節(jié)講述下列內(nèi)容:
● 數(shù)據(jù)庫環(huán)境介紹
● TDatabase的應(yīng)用
● 不同數(shù)據(jù)庫表的切換
● 觸發(fā)器編程
● 存儲過程編程
● 事務(wù)控制應(yīng)用
18.4.1 數(shù)據(jù)庫環(huán)境介紹
本例中采用的數(shù)據(jù)庫服務(wù)器是Local InterBase Server。Local InterBase是InterBase Server的單用戶版32位、兼容ANSI SQL。Local InterBase支持客戶/服務(wù)器應(yīng)用在單機上的開發(fā)和測試,并且可以很容易地適化到InterBase Server上。因此,開發(fā)客戶/服務(wù)器應(yīng)用采用Local InterBase作為原型開發(fā)環(huán)境是很方便的。
18.4.1.1 IBLOCAL的BDE參數(shù)
本例中的SQL數(shù)據(jù)庫是IBLOCAL。它是由BDE配置工具(BDECFG32.EXE)設(shè)置參數(shù)值。它的各項參數(shù)值列于下表:
表18.13 IBLOCAL的各項參數(shù)值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
參 數(shù) 名 參 數(shù) 值
────────────────────────────────────
TYPE INTRBASE
PATH
SERVER NAME C:\INTRBASE\EXAMPLES\EMPLOYEE.GDB
USER NAME SYSDBA
OPEN MODE READ/WRITE
SCHEMA CACHE SIZE 8
LANGDRIVER
SQLQRYMODE
SQLPASSTHRU MODE SHARED AUTOCOMMIT
SCHEMA CHCHE TIME -1
MAX ROWS -1
BATCH COUNT 200
ENABLE SCHEMA CACHE FALSE
SCHEMA CACHE DIR
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
18.4.1.2 數(shù)據(jù)庫結(jié)構(gòu)介紹
IBLOCAL數(shù)據(jù)庫的結(jié)構(gòu)都是由InterBase服務(wù)器工具交互式SQL工具(ISQL)定義的。
用ISQL定義數(shù)據(jù)庫,首先要用Create Database命令建立數(shù)據(jù)庫,建立的新數(shù)據(jù)庫一般是以GDB為擴展名。建立好后,就可以用SQL語言定義數(shù)據(jù)庫表,例如建立EMPLOYEE表的SQL語句如下:
定義域名數(shù)據(jù)類型:
CREATE DOMAIN FIRSTNAME AS VARCHAR(15);
CREATE DOMAIN LASTNAME AS VARCHAR(20);
CREATE DOMAIN COUNTRYNAME AS VARCHAR(15);
CREATE DOMAIN EMPNO AS SMALLINT;
CREATE DOMAIN DEPTNO AS CHAR(3)
CHECK (VALUE = '000' OR (VALUE > '0' AND VALUE <= '999') OR VALUE IS NULL);
CREATE DOMAIN JOBCODE AS VARCHAR(5)
CHECK (VALUE > '99999');
CREATE DOMAIN JOBGRADE AS SMALLINT
CHECK (VALUE BETWEEN 0 AND 6);
CREATE DOMAIN SALARY AS NUMERIC(15, 2)
DEFAULT 0
CHECK (VALUE > 0);
建立EMPLOYEE表:
CREATE TABLE EMPLOYEE (EMP_NO EMPNO NOT NULL,
FIRST_NAME FIRSTNAME NOT NULL,
LAST_NAME LASTNAME NOT NULL,
PHONE_EXT VARCHAR(4),
HIRE_DATE DATE DEFAULT 'NOW' NOT NULL,
DEPT_NO DEPTNO NOT NULL,
JOB_CODE JOBCODE NOT NULL,
JOB_GRADE JOBGRADE NOT NULL,
JOB_COUNTRY COUNTRYNAME NOT NULL,
SALARY SALARY NOT NULL,
FULL_NAME COMPUTED BY (last_name || ', ' || first_name),
PRIMARY KEY (EMP_NO));
CHECK語句是給數(shù)據(jù)庫字段取值范圍加約束條件。PRIMARY_KEY語句是給表建立關(guān)鍵字索引。
如法炮制,就可以定義IBLOCAL中的所有表。
IBLOCAL中的表包括:
EMPLOYEE CUSTOMER DEPARTMENT EMPLOYEE_PROJECT
PROJECT SALES SALARY_HISCORY
各數(shù)據(jù)庫表中的內(nèi)容如下:
表18.14 EmployeeDemoDB中各數(shù)據(jù)庫表的內(nèi)容
━━━━━━━━━━━━━━━━━━━━━━━━━━━
數(shù)據(jù)庫表名 表中內(nèi)容
───────────────────────────
EMPLOYEE 雇員信息
CUSTOMER 客戶信息
DEPARTMENT 部門信息
EMPLOYEE_PROJECT 雇員負責(zé)的工程
PROJECT 工程信息
SALES 銷售信息
SALARY_HISTORY 雇員薪水調(diào)整的歷史信息
━━━━━━━━━━━━━━━━━━━━━━━━━━━
每個數(shù)據(jù)庫表中都定義了關(guān)鍵字段。關(guān)于數(shù)據(jù)庫表中的字段名、類型、大小,這里不再贅述。
相關(guān)推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |