§3.2 數(shù)據(jù)庫組件介紹
用Delphi6開發(fā)數(shù)據(jù)庫應(yīng)用,重點是和各種數(shù)據(jù)庫組件打交道,能和數(shù)據(jù)庫掛鉤的組件對象有5種,它們是:Session(數(shù)據(jù)庫會話)、Database(數(shù)據(jù)庫)、Dataset(數(shù)據(jù)集)、DataSource(數(shù)據(jù)源)、Data control(數(shù)據(jù)控制組件,也叫data-controls即數(shù)據(jù)感知組件)。其中前面4種統(tǒng)稱為數(shù)據(jù)訪問(Data Access)組件。這些組件的相互關(guān)系如圖3-2所示。
ADO組件 Delphi6.0包含了可以用來訪問Microsoft公司的ActiveX Data Objects(ADO)格式數(shù)據(jù)庫的組件。ADO是Micrsoft公司關(guān)于各種類型數(shù)據(jù)的高等界面,后來逐漸演變成滿足所有數(shù)據(jù)訪問需要的完整解決辦法。ADO的對象模型是所有數(shù)據(jù)訪問接口對象模型中最簡單的一種。Microsoft公司用來訪問ADO數(shù)據(jù)的應(yīng)用程序界面技術(shù)是OLE DB.OLE DB是一種底層編程接口,用來訪問許多不同類型的數(shù)據(jù)源,其中包括消息、文件系統(tǒng)以及其他一些非傳統(tǒng)的數(shù)據(jù)源。OLE DB是一個由Component Object Model(COM)接口組成的集合,用來隱藏創(chuàng)建數(shù)據(jù)訪問服務(wù)過程中的細節(jié)。OLEDB提供了訪問任何數(shù)據(jù)資源的方法,包括相互關(guān)聯(lián)的數(shù)據(jù)庫和相互不關(guān)聯(lián)的數(shù)據(jù)庫、Email和文件系統(tǒng)、文本和圖形以及用戶定義的數(shù)據(jù)對象。
Delphi的ADO組件無需依靠BDE而是使用ADO技術(shù),提供了可以通過數(shù)據(jù)控制組件訪問數(shù)據(jù)的新方法。的要求是在使用ADO組件時必須運行ADO/OLE-DB.ADO組件的使用使得DELPHI在訪問數(shù)據(jù)的類型和采用的技術(shù)方面都有了很大的突破。
數(shù)據(jù)模塊設(shè)計窗口 數(shù)據(jù)模塊設(shè)計窗口是用來設(shè)計和維護數(shù)據(jù)模塊的。數(shù)據(jù)模塊設(shè)計窗口中包含了所有以。DTI作為文件擴展名的Data Diagram文件的信息。DTI文件在編譯時不起任何作用。
§3.3 SQL語言在Delphi中的應(yīng)用
在Delphi中使用SQL語言非常方便,一般來說,都是通過Tquery或TADOquery組件來使用SQL語言的。可以在Tquery或TADOquery組件的SQL屬性中設(shè)置SQL語句。設(shè)計程序時,在該組件的屬性對話框中選擇SQL屬性,單擊帶省略號的按鈕,就可以打開String List Editor對話框,然后我們就可以在對話框中添加SQL語句。還可以使用Delphi的SQL Builder來自動生成SQL語句,這樣可以避免手工編寫SQL而可能造成的語法錯誤。
靜態(tài)SQL語句在程序設(shè)計時便已固定下來,它不包含任何參數(shù)和變量。
動態(tài)SQL語句,也被稱作參數(shù)化的語句,在其中間包含著表示字段名或表名的參數(shù),例如下面的語句是一條動態(tài)SQL語句:
Select * From Book Where 圖書編號 =:bookCode;
其中的變量bookCode便是一個參數(shù)變量,它由一個冒號引導(dǎo),在程序運行過程中,必須要為該參數(shù)賦值,該條SQL語句才能正確執(zhí)行,每次運行應(yīng)用程序時可以為該參數(shù)變量賦予不同的值。為參數(shù)賦值有三種方法:
①根據(jù)參數(shù)在SQL語句中出現(xiàn)的順序,設(shè)置TADOQuery組件的parameters屬性值為參數(shù)賦值。
②直接根據(jù)SQL語句中各參數(shù)的名字,調(diào)用ParamByName方法來為各參數(shù)賦值。
③將TADOQuery組件的DataSource屬性設(shè)置為另一個數(shù)據(jù)源,這樣將另一個數(shù)據(jù)源中與當前TADOQuery組件的SQL語句中的參數(shù)名相匹配的字段值賦給其對應(yīng)的參數(shù)。利用這種方法也能實現(xiàn)所謂的連接查詢,創(chuàng)建主要-明細型數(shù)據(jù)庫應(yīng)用。
在使用動態(tài)SQL語句編程時,常常用到一個很重要的方法Prepare,調(diào)用Prepare 方法之后,Delphi會將帶參數(shù)的SQL語句傳送給與其對應(yīng)的數(shù)據(jù)庫引擎,對動態(tài)SQL語句進行語法分析和優(yōu)化。雖然在用動態(tài)SQL語句編程時,調(diào)用Prepare方法并不是必須的,但是調(diào)用Prepare方法后,會極大地提高動態(tài)SQL 語句的執(zhí)行性能,特別是當要反復(fù)多次執(zhí)行同一條動態(tài)SQL語句時,其優(yōu)越性會更加明顯。 如果在應(yīng)用程序中執(zhí)行一條SQL語句之前并沒有顯式地調(diào)用Prepare方法,每次在執(zhí)行SQL 語句時,Delphi會隱含地調(diào)用Prepare方法以準備這個查詢。
TadoQuery部件還有一個Prepare屬性,這是一個布爾型屬性,當其屬性值為True時, 表明該查詢已被準備好了( SQL 語句已被傳送到數(shù)據(jù)庫引擎中 ) , 當我們使用參數(shù)編輯器Parameters Editor來為動態(tài)SQL語句中的參數(shù)賦值時,當設(shè)置完相應(yīng)的參數(shù)值并退出參數(shù)編輯器時,Delphi會隱含地調(diào)用Prepare方法以準備好查詢。
當SQL語句執(zhí)行完之后,要想準備下一個查詢,首先必須調(diào)用Close方法,然后才能調(diào)用Prepare方法準備下一個查詢。一般來說,在一個應(yīng)用程序中應(yīng)該調(diào)用一次Prepare方法,常常在窗體的OnCreate事件處理過程中調(diào)用Prepare方法, 然后用上述介紹的方法為參數(shù)賦值,最后調(diào)用Open方法或ExecSQL方法執(zhí)行SQL語句,以完成查詢。
當然在調(diào)用Prepare方法準備好一個查詢時,會消耗一些數(shù)據(jù)庫資源, 因而每當一個查詢執(zhí)行完畢之后,要養(yǎng)成調(diào)用UnPrepare方法以撤消查詢的好習慣。在運行程序過程中,通過程序改變TQuery或TADOquery部件的SQL屬性值時,Delphi會自動地調(diào)用Close方法和UnPrepare 方法,以撤消查詢。
在程序運行過程中,要想設(shè)置Tquery或TADOquery部件的SQL屬性,必須首先調(diào)用Close方法,關(guān)閉TQuery或TADOquery部件,然后再調(diào)用Clear方法清除SQL屬性中現(xiàn)存的SQL命令語句, 最后再調(diào)用Add方法為SQL屬性設(shè)置新的SQL命令語句。例如:
datamodule4.adoquery2.close;
datamodule4.adoquery2.sql.clear;
datamodule4.adoquery2.sql.add('SELECT 借書證號,密碼 FROM [user] WHERE (借書證號 = :tt)');
datamodule4.adoquery2.parameters[0].value:=username;
datamodule4.adoquery2.open;
在為TQuery或TADOquery部件設(shè)置SQL屬性時調(diào)用Close方法總是很安全的,如果TQuery或TADOquery部件已經(jīng)被關(guān)閉了,調(diào)用Close方法時不會產(chǎn)生任何影響。在應(yīng)用程序中為SQL屬性設(shè)置新的SQL 命令語句時,必須要調(diào)用Clear方法以清除SQL屬性中現(xiàn)存的SQL命令語句,如果不調(diào)用Clear方法,便調(diào)用Add方法向SQL屬性中設(shè)置SQL命令語句,那么新設(shè)置的SQL命令語句會追加在現(xiàn)存SQL命令語句后面, 在程序運行時常常會出現(xiàn)出乎意料的查詢結(jié)果甚至程序無法運行下去。
在這里要特別注意的,一般情況下TQuery或TADOquery部件的SQL屬性只能包含一條完整的SQL語句,它不允許被設(shè)置成多條SQL語句。當然有些數(shù)據(jù)庫服務(wù)器也支持在TQuery或TADOquery部件的SQL屬性中設(shè)置多條SQL語句,只要數(shù)據(jù)庫服務(wù)器允許這樣,我們在編程時可以為 SQL 屬性設(shè)置多條SQL語句。
在為TQuery或TADOquery部件設(shè)置完SQL屬性的屬性值之后,也即編寫好適當?shù)腟QL程序之后,可以有多種方式來執(zhí)行SQL程序。
在設(shè)計過程中,設(shè)置完TQuery或TADOquery部件的SQL屬性之后將其Active屬性的值置為True, 這樣便可以執(zhí)行SQL屬性中的SQL程序,如果應(yīng)用中有與TQuery或TADOquery部件相連的數(shù)據(jù)瀏覽部件( 如TDDGrid TDBEdit等)那么在這些數(shù)據(jù)瀏覽部件中會顯示SQL程序的執(zhí)行結(jié)果。
在應(yīng)用程序運行過程中,通過程序調(diào)用TQuery或TADOquery組件的Open方法或ExecSQL 方法可以執(zhí)行其SQL屬性中的SQL程序。Open方法和ExecSQL方法是不一樣的。Open方法只能用來執(zhí)行SQL語言的查詢語句(Select命令), 并返回一個查詢結(jié)果集,而ExecSQL方法還可以用來執(zhí)行其它常用的SQL語句(如INSERT, UPDATE, DELETE等命令),例如:
Query1.Open (這樣會返回一個查詢結(jié)果集)
如果調(diào)用Open方法,而沒有查詢結(jié)果時,會出錯。此時應(yīng)該調(diào)用ExecSQL 方法來代替Open方法。如:
Query1.ExecSQL (沒有返回結(jié)果)
當然在設(shè)計應(yīng)用程序時,程序設(shè)計人員是無法確定TQuery或TADOquery組件中的SQL 語句是否會返回一個查詢結(jié)果的。對于這種情況應(yīng)當用Try…Except模塊來設(shè)計程序。在 Try 部分調(diào)用Open方法,而在Except部分調(diào)用ExceSQL方法,這樣才能保證程序的正確運行。
例如:
Try
Query1.Open
Except
Query1.ExecSQL
End
通過Tquery或TADOquery組件可以獲得兩種類型的數(shù)據(jù):
u “活動”的數(shù)據(jù)
這種數(shù)據(jù)就跟通過TTable部件獲得的數(shù)據(jù)一樣,用戶可以通過數(shù)據(jù)瀏覽部件來編輯修改這些數(shù)據(jù),并且當調(diào)用Post方法或當焦點離開當前的數(shù)據(jù)瀏覽部件時,用戶對數(shù)據(jù)的修改自動地被寫回到數(shù)據(jù)庫中。
u 非活動的數(shù)據(jù)(只讀數(shù)據(jù))
用戶通過數(shù)據(jù)瀏覽部件是不能修改其中的數(shù)據(jù)。在缺省情況下,通過TQuery部件獲得的查詢結(jié)果數(shù)據(jù)是只讀數(shù)據(jù),要想獲得“活動”的數(shù)據(jù),在應(yīng)用程序中必須要設(shè)置Tquery或TADOquery組件的RequestLive屬性值為True,然而并不是在任何情況下(通過設(shè)置RequestLive的屬值True)都可以獲得“活動”的數(shù)據(jù)的,要想獲得“活動”的數(shù)據(jù),除了將TQuery部件的RequestLive屬性設(shè)置為True外,相應(yīng)的SQL命令還要滿足以下條件。
本地SQL語句查詢情況下,要得到可更新的數(shù)據(jù)集,SQL語句的限制為:
查詢只能涉及到一個單獨的表
SQL語句中不能包含ORDER BY命令
SQL語句中不能含聚集運算符SUM或AVG
在Select后的字段列表中不能有計算字段
在Select語句WHERE部分只能包含字段值與常量的比較運算,這些比較運算符是:Like, >, <, >=, <=.各比較運算之間可以有并和交運算:AND和OR
當通過SQL語句查詢數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)庫表:
查詢只能涉及到一個單獨的表
SQL語句中不能包含ORDER BY命令
SQL語句中不能含聚集運算符SUM或AVG運算
另外,如果是查詢Sybase數(shù)據(jù)庫中的表,那么被查詢的表中只能有一個索引。
如果在應(yīng)用程序中要求TQuery或TADOquery組件返回一個“活動”的查詢結(jié)果數(shù)據(jù)集,但是SQL 命令語句不滿足上述約束條件時,對于本地數(shù)據(jù)庫的SQL查詢,BDE只能返回只讀的數(shù)據(jù)集。對于數(shù)據(jù)庫服務(wù)器中的SQL查詢,只能返回錯誤的代碼。當Tquery或TADOquery組件返回一個“活動”的查詢結(jié)果數(shù)據(jù)集時,它的CanModIfy屬性的值會被設(shè)置成True。
用Delphi6開發(fā)數(shù)據(jù)庫應(yīng)用,重點是和各種數(shù)據(jù)庫組件打交道,能和數(shù)據(jù)庫掛鉤的組件對象有5種,它們是:Session(數(shù)據(jù)庫會話)、Database(數(shù)據(jù)庫)、Dataset(數(shù)據(jù)集)、DataSource(數(shù)據(jù)源)、Data control(數(shù)據(jù)控制組件,也叫data-controls即數(shù)據(jù)感知組件)。其中前面4種統(tǒng)稱為數(shù)據(jù)訪問(Data Access)組件。這些組件的相互關(guān)系如圖3-2所示。
ADO組件 Delphi6.0包含了可以用來訪問Microsoft公司的ActiveX Data Objects(ADO)格式數(shù)據(jù)庫的組件。ADO是Micrsoft公司關(guān)于各種類型數(shù)據(jù)的高等界面,后來逐漸演變成滿足所有數(shù)據(jù)訪問需要的完整解決辦法。ADO的對象模型是所有數(shù)據(jù)訪問接口對象模型中最簡單的一種。Microsoft公司用來訪問ADO數(shù)據(jù)的應(yīng)用程序界面技術(shù)是OLE DB.OLE DB是一種底層編程接口,用來訪問許多不同類型的數(shù)據(jù)源,其中包括消息、文件系統(tǒng)以及其他一些非傳統(tǒng)的數(shù)據(jù)源。OLE DB是一個由Component Object Model(COM)接口組成的集合,用來隱藏創(chuàng)建數(shù)據(jù)訪問服務(wù)過程中的細節(jié)。OLEDB提供了訪問任何數(shù)據(jù)資源的方法,包括相互關(guān)聯(lián)的數(shù)據(jù)庫和相互不關(guān)聯(lián)的數(shù)據(jù)庫、Email和文件系統(tǒng)、文本和圖形以及用戶定義的數(shù)據(jù)對象。
Delphi的ADO組件無需依靠BDE而是使用ADO技術(shù),提供了可以通過數(shù)據(jù)控制組件訪問數(shù)據(jù)的新方法。的要求是在使用ADO組件時必須運行ADO/OLE-DB.ADO組件的使用使得DELPHI在訪問數(shù)據(jù)的類型和采用的技術(shù)方面都有了很大的突破。
數(shù)據(jù)模塊設(shè)計窗口 數(shù)據(jù)模塊設(shè)計窗口是用來設(shè)計和維護數(shù)據(jù)模塊的。數(shù)據(jù)模塊設(shè)計窗口中包含了所有以。DTI作為文件擴展名的Data Diagram文件的信息。DTI文件在編譯時不起任何作用。
§3.3 SQL語言在Delphi中的應(yīng)用
在Delphi中使用SQL語言非常方便,一般來說,都是通過Tquery或TADOquery組件來使用SQL語言的。可以在Tquery或TADOquery組件的SQL屬性中設(shè)置SQL語句。設(shè)計程序時,在該組件的屬性對話框中選擇SQL屬性,單擊帶省略號的按鈕,就可以打開String List Editor對話框,然后我們就可以在對話框中添加SQL語句。還可以使用Delphi的SQL Builder來自動生成SQL語句,這樣可以避免手工編寫SQL而可能造成的語法錯誤。
靜態(tài)SQL語句在程序設(shè)計時便已固定下來,它不包含任何參數(shù)和變量。
動態(tài)SQL語句,也被稱作參數(shù)化的語句,在其中間包含著表示字段名或表名的參數(shù),例如下面的語句是一條動態(tài)SQL語句:
Select * From Book Where 圖書編號 =:bookCode;
其中的變量bookCode便是一個參數(shù)變量,它由一個冒號引導(dǎo),在程序運行過程中,必須要為該參數(shù)賦值,該條SQL語句才能正確執(zhí)行,每次運行應(yīng)用程序時可以為該參數(shù)變量賦予不同的值。為參數(shù)賦值有三種方法:
①根據(jù)參數(shù)在SQL語句中出現(xiàn)的順序,設(shè)置TADOQuery組件的parameters屬性值為參數(shù)賦值。
②直接根據(jù)SQL語句中各參數(shù)的名字,調(diào)用ParamByName方法來為各參數(shù)賦值。
③將TADOQuery組件的DataSource屬性設(shè)置為另一個數(shù)據(jù)源,這樣將另一個數(shù)據(jù)源中與當前TADOQuery組件的SQL語句中的參數(shù)名相匹配的字段值賦給其對應(yīng)的參數(shù)。利用這種方法也能實現(xiàn)所謂的連接查詢,創(chuàng)建主要-明細型數(shù)據(jù)庫應(yīng)用。
在使用動態(tài)SQL語句編程時,常常用到一個很重要的方法Prepare,調(diào)用Prepare 方法之后,Delphi會將帶參數(shù)的SQL語句傳送給與其對應(yīng)的數(shù)據(jù)庫引擎,對動態(tài)SQL語句進行語法分析和優(yōu)化。雖然在用動態(tài)SQL語句編程時,調(diào)用Prepare方法并不是必須的,但是調(diào)用Prepare方法后,會極大地提高動態(tài)SQL 語句的執(zhí)行性能,特別是當要反復(fù)多次執(zhí)行同一條動態(tài)SQL語句時,其優(yōu)越性會更加明顯。 如果在應(yīng)用程序中執(zhí)行一條SQL語句之前并沒有顯式地調(diào)用Prepare方法,每次在執(zhí)行SQL 語句時,Delphi會隱含地調(diào)用Prepare方法以準備這個查詢。
TadoQuery部件還有一個Prepare屬性,這是一個布爾型屬性,當其屬性值為True時, 表明該查詢已被準備好了( SQL 語句已被傳送到數(shù)據(jù)庫引擎中 ) , 當我們使用參數(shù)編輯器Parameters Editor來為動態(tài)SQL語句中的參數(shù)賦值時,當設(shè)置完相應(yīng)的參數(shù)值并退出參數(shù)編輯器時,Delphi會隱含地調(diào)用Prepare方法以準備好查詢。
當SQL語句執(zhí)行完之后,要想準備下一個查詢,首先必須調(diào)用Close方法,然后才能調(diào)用Prepare方法準備下一個查詢。一般來說,在一個應(yīng)用程序中應(yīng)該調(diào)用一次Prepare方法,常常在窗體的OnCreate事件處理過程中調(diào)用Prepare方法, 然后用上述介紹的方法為參數(shù)賦值,最后調(diào)用Open方法或ExecSQL方法執(zhí)行SQL語句,以完成查詢。
當然在調(diào)用Prepare方法準備好一個查詢時,會消耗一些數(shù)據(jù)庫資源, 因而每當一個查詢執(zhí)行完畢之后,要養(yǎng)成調(diào)用UnPrepare方法以撤消查詢的好習慣。在運行程序過程中,通過程序改變TQuery或TADOquery部件的SQL屬性值時,Delphi會自動地調(diào)用Close方法和UnPrepare 方法,以撤消查詢。
在程序運行過程中,要想設(shè)置Tquery或TADOquery部件的SQL屬性,必須首先調(diào)用Close方法,關(guān)閉TQuery或TADOquery部件,然后再調(diào)用Clear方法清除SQL屬性中現(xiàn)存的SQL命令語句, 最后再調(diào)用Add方法為SQL屬性設(shè)置新的SQL命令語句。例如:
datamodule4.adoquery2.close;
datamodule4.adoquery2.sql.clear;
datamodule4.adoquery2.sql.add('SELECT 借書證號,密碼 FROM [user] WHERE (借書證號 = :tt)');
datamodule4.adoquery2.parameters[0].value:=username;
datamodule4.adoquery2.open;
在為TQuery或TADOquery部件設(shè)置SQL屬性時調(diào)用Close方法總是很安全的,如果TQuery或TADOquery部件已經(jīng)被關(guān)閉了,調(diào)用Close方法時不會產(chǎn)生任何影響。在應(yīng)用程序中為SQL屬性設(shè)置新的SQL 命令語句時,必須要調(diào)用Clear方法以清除SQL屬性中現(xiàn)存的SQL命令語句,如果不調(diào)用Clear方法,便調(diào)用Add方法向SQL屬性中設(shè)置SQL命令語句,那么新設(shè)置的SQL命令語句會追加在現(xiàn)存SQL命令語句后面, 在程序運行時常常會出現(xiàn)出乎意料的查詢結(jié)果甚至程序無法運行下去。
在這里要特別注意的,一般情況下TQuery或TADOquery部件的SQL屬性只能包含一條完整的SQL語句,它不允許被設(shè)置成多條SQL語句。當然有些數(shù)據(jù)庫服務(wù)器也支持在TQuery或TADOquery部件的SQL屬性中設(shè)置多條SQL語句,只要數(shù)據(jù)庫服務(wù)器允許這樣,我們在編程時可以為 SQL 屬性設(shè)置多條SQL語句。
在為TQuery或TADOquery部件設(shè)置完SQL屬性的屬性值之后,也即編寫好適當?shù)腟QL程序之后,可以有多種方式來執(zhí)行SQL程序。
在設(shè)計過程中,設(shè)置完TQuery或TADOquery部件的SQL屬性之后將其Active屬性的值置為True, 這樣便可以執(zhí)行SQL屬性中的SQL程序,如果應(yīng)用中有與TQuery或TADOquery部件相連的數(shù)據(jù)瀏覽部件( 如TDDGrid TDBEdit等)那么在這些數(shù)據(jù)瀏覽部件中會顯示SQL程序的執(zhí)行結(jié)果。
在應(yīng)用程序運行過程中,通過程序調(diào)用TQuery或TADOquery組件的Open方法或ExecSQL 方法可以執(zhí)行其SQL屬性中的SQL程序。Open方法和ExecSQL方法是不一樣的。Open方法只能用來執(zhí)行SQL語言的查詢語句(Select命令), 并返回一個查詢結(jié)果集,而ExecSQL方法還可以用來執(zhí)行其它常用的SQL語句(如INSERT, UPDATE, DELETE等命令),例如:
Query1.Open (這樣會返回一個查詢結(jié)果集)
如果調(diào)用Open方法,而沒有查詢結(jié)果時,會出錯。此時應(yīng)該調(diào)用ExecSQL 方法來代替Open方法。如:
Query1.ExecSQL (沒有返回結(jié)果)
當然在設(shè)計應(yīng)用程序時,程序設(shè)計人員是無法確定TQuery或TADOquery組件中的SQL 語句是否會返回一個查詢結(jié)果的。對于這種情況應(yīng)當用Try…Except模塊來設(shè)計程序。在 Try 部分調(diào)用Open方法,而在Except部分調(diào)用ExceSQL方法,這樣才能保證程序的正確運行。
例如:
Try
Query1.Open
Except
Query1.ExecSQL
End
通過Tquery或TADOquery組件可以獲得兩種類型的數(shù)據(jù):
u “活動”的數(shù)據(jù)
這種數(shù)據(jù)就跟通過TTable部件獲得的數(shù)據(jù)一樣,用戶可以通過數(shù)據(jù)瀏覽部件來編輯修改這些數(shù)據(jù),并且當調(diào)用Post方法或當焦點離開當前的數(shù)據(jù)瀏覽部件時,用戶對數(shù)據(jù)的修改自動地被寫回到數(shù)據(jù)庫中。
u 非活動的數(shù)據(jù)(只讀數(shù)據(jù))
用戶通過數(shù)據(jù)瀏覽部件是不能修改其中的數(shù)據(jù)。在缺省情況下,通過TQuery部件獲得的查詢結(jié)果數(shù)據(jù)是只讀數(shù)據(jù),要想獲得“活動”的數(shù)據(jù),在應(yīng)用程序中必須要設(shè)置Tquery或TADOquery組件的RequestLive屬性值為True,然而并不是在任何情況下(通過設(shè)置RequestLive的屬值True)都可以獲得“活動”的數(shù)據(jù)的,要想獲得“活動”的數(shù)據(jù),除了將TQuery部件的RequestLive屬性設(shè)置為True外,相應(yīng)的SQL命令還要滿足以下條件。
本地SQL語句查詢情況下,要得到可更新的數(shù)據(jù)集,SQL語句的限制為:
查詢只能涉及到一個單獨的表
SQL語句中不能包含ORDER BY命令
SQL語句中不能含聚集運算符SUM或AVG
在Select后的字段列表中不能有計算字段
在Select語句WHERE部分只能包含字段值與常量的比較運算,這些比較運算符是:Like, >, <, >=, <=.各比較運算之間可以有并和交運算:AND和OR
當通過SQL語句查詢數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)庫表:
查詢只能涉及到一個單獨的表
SQL語句中不能包含ORDER BY命令
SQL語句中不能含聚集運算符SUM或AVG運算
另外,如果是查詢Sybase數(shù)據(jù)庫中的表,那么被查詢的表中只能有一個索引。
如果在應(yīng)用程序中要求TQuery或TADOquery組件返回一個“活動”的查詢結(jié)果數(shù)據(jù)集,但是SQL 命令語句不滿足上述約束條件時,對于本地數(shù)據(jù)庫的SQL查詢,BDE只能返回只讀的數(shù)據(jù)集。對于數(shù)據(jù)庫服務(wù)器中的SQL查詢,只能返回錯誤的代碼。當Tquery或TADOquery組件返回一個“活動”的查詢結(jié)果數(shù)據(jù)集時,它的CanModIfy屬性的值會被設(shè)置成True。