第一節(jié) BDE、ADO、InterBase和dbExpress
Delphi中處理數(shù)據(jù)庫主要有兩種方法,也就是BDE、ADO,從Delphi 6.0開始還加入了一種dbExpress方法。 另外,Delphi還提供了專門處理Borland 公司自己的數(shù)據(jù)庫產(chǎn)品InterBase 數(shù)據(jù)庫的專門的方法。
BDE(Borland Databas Engine), 是Delphi中最古老的技術(shù),從delphi 2.0加入BDE 技術(shù)以后,一直是Delphi處理數(shù)據(jù)庫的事實(shí)上的標(biāo)準(zhǔn)。BDE 是一個(gè)基于驅(qū)動(dòng)程序的體系結(jié)構(gòu),每一種數(shù)據(jù)格式或數(shù)據(jù)源都有一種驅(qū)動(dòng)程序來驅(qū)動(dòng)相近的數(shù)據(jù)源。BDE 可以很好的支持現(xiàn)在最流行的ODBC API方法,ODBC是一種C/C++ 應(yīng)用程序編程接口(API ),無論是對(duì)任何一種客戶/ 服務(wù)器關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS ),還是最流行索引順序訪問方法(ISAM)數(shù)據(jù)庫(Jet、Foxpro), 都能很好的訪問。
同時(shí),由于BDE 的驅(qū)動(dòng)程序主要直接來自于第三方開發(fā)商,所以,對(duì)于像Oracle這些非微軟的數(shù)據(jù)庫,執(zhí)行效率上比較高。正是這些特點(diǎn),使BDE 技術(shù)還是得到了很多數(shù)據(jù)庫開發(fā)程序員的歡迎。
ADO 技術(shù)是微軟提出來的處理關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的新技術(shù),它基于微軟被稱為OLE DB的數(shù)據(jù)訪問模式,它是專門為了給大范圍商業(yè)數(shù)據(jù)源提供訪問而設(shè)計(jì)的,包括傳統(tǒng)的關(guān)系型數(shù)據(jù)表、電子郵件系統(tǒng)、圖形格式、Internet資源等。ADO 所需內(nèi)存更少,更適合大流量和大事務(wù)量的網(wǎng)絡(luò)計(jì)算機(jī)系統(tǒng)。
ADO 頂層有三個(gè)對(duì)象:Connection、Command、Recordset。
Connection用以指定數(shù)據(jù)源,建立和數(shù)據(jù)源的連接。
Command 對(duì)象用以對(duì)數(shù)劇源執(zhí)行指定的命令,可以接受SQL 語句,表和存儲(chǔ)過程的名稱,執(zhí)行SQL 查詢,更新數(shù)據(jù),插入紀(jì)錄等。
Recordset 對(duì)象表示的是來自表或命令執(zhí)行結(jié)果的記錄全集,操縱來自提供者的幾乎所有數(shù)據(jù)。
由于ADO 技術(shù)的迅速普及,從Delphi 5.0 開始,加入了ADO 技術(shù)的模塊,并逐步成為Delphi數(shù)據(jù)庫設(shè)計(jì)的主流。但是,和VB的ADODC 相比,它還是有所不同的,在數(shù)據(jù)綁定上,它更多的吸收了BDE 的特點(diǎn),以做到和原來的程序兼容,同時(shí),它又可以接受標(biāo)準(zhǔn)ADO 技術(shù)的各種屬
性和方法,在接受這些屬性和方法時(shí),它是和數(shù)據(jù)綁定控件脫離的,當(dāng)然從某種意義上來說,這種方案提高了執(zhí)行效率,給設(shè)計(jì)人員以更多的選擇。
dbExpress 是Delphi 6.0加入的最新的數(shù)據(jù)庫模塊,它不使用緩存,可以快速瀏覽大量的數(shù)據(jù),但是,不使用緩存就不能更改,所以它的標(biāo)準(zhǔn)方式是只讀的。它一個(gè)重要的特點(diǎn)是交叉平臺(tái),可以和Linux 數(shù)據(jù)庫連接,速度相當(dāng)快。
下面的討論,將以ADO 技術(shù)為主線,最后再說明BDE 和dbExpress的應(yīng)用方式。
第二節(jié) ADO 面板的主要組件
ADO 面板一共有7 個(gè)組件:
ADOConnection: 主要用于建立數(shù)據(jù)庫的連接;
ADOdataSet:ADO 提取和操作數(shù)據(jù)庫的主要數(shù)據(jù)集,可以直接連接到數(shù)據(jù)庫,也可以通過 ADOConnection連接到數(shù)據(jù)庫。
ADOtable:主要用以操作和提取單個(gè)基表的數(shù)據(jù),可以直接連接到數(shù)據(jù)庫,也可以通過 ADOConnection連接到數(shù)據(jù)庫。
ADOquery:通過SQL 語言提取數(shù)據(jù),其連接數(shù)據(jù)庫的方式和前兩種一樣。
ADOStoredProc: 這個(gè)組件專門用于運(yùn)行數(shù)據(jù)庫中的存儲(chǔ)過程。
ADOCommand:該組件用于運(yùn)行一些SQL 命令,這個(gè)組件可以和支持?jǐn)?shù)據(jù)集的組件一起使用,也可以直接從一個(gè)基表中提取一個(gè)數(shù)據(jù)集。
RDSConnection: 一個(gè)進(jìn)程或一臺(tái)計(jì)算機(jī)傳遞到另一個(gè)進(jìn)程或計(jì)算機(jī)的數(shù)據(jù)集合。
為了連接數(shù)據(jù)綁定控件,上述組件往往要和處于Data Access 中的Datasource配合使用。
可以看出,和VB的ADODC 不同的,Delphi中解決同一個(gè)問題提供了多種方案,看起來似乎增加了麻煩,但是卻可以給程序員更大的自由空間,便于設(shè)計(jì)出高效率的數(shù)據(jù)庫程序來。
下面通過幾個(gè)例子來說明ADO 控件的用法。
第三節(jié) ADOtable組件
ADOtable、ADOdataSet、ADOquery和ADOStoredProc都繼承同一個(gè)父類TCustomADODataSet,所以,在屬性事件和方法上有很多相似的地方,但它主要是針對(duì)數(shù)據(jù)庫中的表進(jìn)行操作。
ADO -〉A(chǔ)DOtable
屬性:
Name='控件名'
ConnectionString='連接字符串'
可以通過點(diǎn)擊右邊的按鈕,通過向?qū)Ы?shù)據(jù)源。有時(shí)候需要知道相對(duì)路徑,可以用下面的方法找到程序當(dāng)前的路徑:
tpath:=ExtractFilepath(Application.Exename);
文件名:=Tpath+'..\data\Test.mdb'
表明數(shù)據(jù)庫在當(dāng)前程序上一層的Data文件夾下。
TableName='表名'
Active=true
這就激活了數(shù)據(jù)源,為了和綁定控件聯(lián)系,要增加一個(gè)DadaSource控件。事實(shí)上,所有的綁定控件都是和DadaSource聯(lián)系。
Data Access-〉DadaSource
屬性:
Dataset=ADOtable.Name
加入綁定控件:
Data Controls-〉
DBgrid(表格)
屬性
DadaSource='DadaSource.Name'
DBNavigator(導(dǎo)航條)
屬性
DadaSource='DadaSource.Name'
運(yùn)行一下可以看出關(guān)系
下面介紹一下ADOtable的一些重要的方法,這些方法大部分和Table是兼容的。
為了便于敘述,ADOtable控件的Name定為 ADOtable1
1)移動(dòng)指針
第一個(gè): ADotable1.First;
最后一個(gè): ADotable1.Last;
下一個(gè): ADotable1.Next;
前一個(gè): ADotable1.Prior;
2)從字段中取出數(shù)據(jù)
通過如下方法可以訪問字段的值
ADOtable1.FieldValues['字段名']
ADOtable1.Field[索引值]
在讀寫字段的時(shí)候,又是根據(jù)需要可以加上強(qiáng)制類型轉(zhuǎn)換
例如:
Edit1.text:=ADOtable1.Field[0].AsString;
用下面的方法可以去除字段的性質(zhì):
ADOtable1.fielddefs[索引值].name; 字段名
ADOtable1.fielddefs[索引值].Size; 字段大小
ADOtable1.fielddefs[索引值].Datatype; 字段屬性
3)修改數(shù)據(jù):
修改數(shù)據(jù)的時(shí)候,需要先建立EDIT方法,然后用Post方法才能真正的寫入。
ADOtable1.edit;
ADOtable1.FieldValues['姓名']:='王秀琴';
ADOtable1.post;
4)增加一條空紀(jì)錄: ADOtable1.append;
新增紀(jì)錄也可以用如下方法,在新增紀(jì)錄的同時(shí)輸入數(shù)據(jù)
ADOtable1.appendRecord(xxx,xxx,xxx,....);
5)刪除當(dāng)前紀(jì)錄:ADOtable1.delete;
如果在ADOtable1的OnBeforeDelete方法中寫下:
if messagedlg('確實(shí)要?jiǎng)h除嗎?',mtinformation,[mbyes,mbno],
0)=mrno then abort();
可以實(shí)現(xiàn)刪除前的提示。
6)過濾
可以用如下的方法實(shí)現(xiàn)數(shù)據(jù)的過濾
在ADOtable1的OnFilterRecord方法中寫下:
Accept:=(條件);
然后
ADOtable1.filtered:=true; 為實(shí)現(xiàn)過濾。
ADOtable1.filtered:=false; 為解除過濾。
7)指針在文件的頭尾
指針在最后一條記錄之后 ADOtable1.Eof
指針在第一條記錄之前 ADOtable1.Bof
如此可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的遍歷
form1.ADOtable1.first;
while not form1.ADOtable1.eof do
Begin
.......
form1.ADOtable1.next;
End;
8)此外, ADOtable組件還繼承了ADO 中的RecordSet對(duì)象幾乎全部屬性和方法,簡述如下:
with adoTable1.Recordset do
begin
//屬性
PageSize 一頁所包含的記錄數(shù)
PageCount 數(shù)據(jù)的頁數(shù)
AbsolutePage; 當(dāng)前記錄所在頁
AbsolutePosition; 當(dāng)前記錄的序號(hào)位置
BOF; 指針在第一個(gè)記錄之前
EOF; 指針在最后一個(gè)記錄之后
//方法
AddNew fieldList,Values; 創(chuàng)建新記錄,其中fieldList為用數(shù)
組表示的字段名集,Values為用數(shù)組表
示的數(shù)據(jù)集。
Cancel; 取消上一步所作的修改
Update Fields,Values; 保存對(duì)當(dāng)前記錄所作的修改
Delete; 刪除當(dāng)前記錄
Move(n); 移動(dòng)n 條記錄
MoveFirst; 移動(dòng)到第一條紀(jì)錄
MoveLast; 移動(dòng)到最后一條紀(jì)錄
MoveNext 移動(dòng)到下一條紀(jì)錄
MovePrevious 移動(dòng)到上一條紀(jì)錄
Requery; 通過從新執(zhí)行對(duì)象所基于的查詢,以
更新RecordSet 對(duì)象中的數(shù)據(jù)。
end;
使用Recordset 對(duì)象來處理數(shù)據(jù)集的數(shù)據(jù),會(huì)發(fā)現(xiàn)數(shù)據(jù)幫定控件的指針一般不會(huì)跟著移動(dòng),這實(shí)際上給設(shè)計(jì)者提供了另一個(gè)在后臺(tái)快速處理數(shù)據(jù)的方法。
附錄:關(guān)于TActionList控件的使用
在Standard面板,提供了一個(gè)TActionList 控件,它集中了大部分按鈕的使用方法,可以簡化按鈕的設(shè)計(jì)。
方法:
調(diào)入TActionList,雙擊,可以看到一個(gè)面板,右鍵 -〉New Standard Action 選擇 Datasat下的適當(dāng)?shù)目刂?,可以選擇多個(gè)。
以后加入的開關(guān),只要在屬性Action 中選擇適當(dāng)?shù)捻?xiàng)目就可以了,不需要專門編程,實(shí)例見“ActionList應(yīng)用”。
第四節(jié) ADOQuery組件
和ADOtable組件一樣,ADOquery繼承了同一個(gè)父類TCustomADODataSet,所以,上面說到的ADOtable屬性事件和方法基本上是通用的,但它主要是針對(duì)數(shù)據(jù)庫中的SQL 命令進(jìn)行操作。
下面主要說一下ADOquery特殊的地方。
1)SQL 屬性
SQL 是TStrings類型的屬性,包含了ADOquery組件要執(zhí)行的SQL 命令,是ADOquery最為重要的屬性之一。
在應(yīng)用程序中,需要調(diào)用Open方法或者ExecSQL 方法來執(zhí)行在SQL 中的命令。在設(shè)計(jì)階段,可以利用屬性編輯起來編寫。
例如:
Width ADOquery do
Begin
//重新寫入時(shí),要關(guān)閉原來的查詢
Close;
width SQL do
Begin
//因?yàn)锳dd是在原來的基礎(chǔ)上加入,所以先清除原來的SQL命令
Clear;
Add('selsct 編號(hào),姓名,獎(jiǎng)金')
Add('From 獎(jiǎng)金表')
End;
//執(zhí)行SQL 命令
Open;
End;
查詢命令也可以這樣來寫:
s1:='編號(hào)';
s2:='姓名';
s3:='金額';
with ADOquery1 do
begin
sql.Clear;
SQL.Add('select ');
SQL.Add(s1+','+s2+','+s3);
SQL.Add(' From 獎(jiǎng)金 ');
execsql;
active:=true;
end;
效果是一樣的。
第五節(jié) ADOConnection 和 ADODataSet
雖然ADOTable和ADOQuery組件可以非常簡單的連接數(shù)據(jù)庫,但是當(dāng)需要更加精細(xì)的控制數(shù)據(jù)庫的時(shí)候,往往需要應(yīng)用ADO 更多的方法,我們知道,支撐ADO 的主要由Connection,Command,Recordsrt三個(gè)對(duì)象組成, 對(duì)應(yīng)的就有ADOConnection和ADOCommand控件,而Recordsrt對(duì)象屬性和方法,封裝在ADODataSet中,同時(shí)ADODataSet本身,也具備和ADOtable組件相同的對(duì)數(shù)據(jù)綁定控件控值的屬性和方法。
這就大大提高了對(duì)數(shù)據(jù)庫的控制能力。
在ADO 頂層有三個(gè)對(duì)象中Connection處在最頂層,用以指定數(shù)據(jù)源,建立和數(shù)據(jù)源的連接。所以,ADOConnection必須和其它的數(shù)據(jù)控件連接才有效,最常用的就是和ADODataSet配合。
下面首先介紹連接方法,然后再討論其它的問題
1)ADOConnection的加入和連接
加入ADOConnection
屬性:ConnectionString='連接字符串'
加入ADODataSat
屬性:Connection='ADOConnection1' ..... (ADOConnection,Name)
CommandType=cmdtable ...使用表連接
CommandText 根據(jù)上面的選擇,或選擇表,或出現(xiàn)SQL 編輯框。
Active=True 激活。
加入DataSource
屬性:Dataset=ADODataSat 完成連接,再連接數(shù)據(jù)綁定控件。
2)ADOConnection的重要屬性和方法
屬性:
a).Attributes
設(shè)置連接的數(shù)據(jù)庫自動(dòng)處理事務(wù)的能力
xCommitRetaining:提交一個(gè)事務(wù)后自動(dòng)開始一個(gè)新事務(wù)
xAbortRetaining :回退一個(gè)事務(wù)的同時(shí)開始一個(gè)新事務(wù)
b).Connected
標(biāo)識(shí)和數(shù)據(jù)庫的連接受否處于激活(True)
方法:
c).Open(UserID,PassWord)
打開一個(gè)連接(可以提供用戶名和密碼)
d).Cancel
關(guān)閉數(shù)據(jù)庫的連接
e).Close
釋放所有的系統(tǒng)關(guān)聯(lián)資源
f).Execute 執(zhí)行一個(gè)SQL 命令。
完整的表述是
Execute(SQL命令,該命令設(shè)計(jì)的記錄數(shù)目,Option)
其中,Option的值如下
eoAsyncExecute 異步執(zhí)行指定的命令
eoAsyncFetch 給定Cache屬性的值后,再異步的取得數(shù)據(jù)
eoAsyncFetchNonBlocking 非阻塞式線程執(zhí)行
eoExecuteNoRecords 沒有返回紀(jì)錄
g).GetProcedureNames(List:Tstring);
獲取數(shù)據(jù)庫服務(wù)器上的存儲(chǔ)過程名稱,過程名保留在List參數(shù)中。
f).GetTableNames(List:Tstring;SystemTables:Boolean=False)
獲取數(shù)據(jù)庫的數(shù)據(jù)表,表名存放在List參數(shù)中,SystemTables指示是否獲取數(shù)據(jù)庫系統(tǒng)表的名稱,系統(tǒng)表是關(guān)于數(shù)據(jù)庫類型定義和用戶信息的數(shù)據(jù)表,是數(shù)據(jù)庫本身自動(dòng)產(chǎn)生的。在特殊的設(shè)計(jì)中,這個(gè)表格可能會(huì)有用。
3)ADODataSet的屬性和方法
我們?cè)贏DOTable中討論的屬性和方法,幾乎都可以在ADODataSet中得到應(yīng)用,但還有幾個(gè)特殊的屬性:
CommandType
主要用于控制CommandText屬性的狀態(tài),其中:
cmdtable ...CommandText使用“表名”連接
(內(nèi)部是做了SQL 對(duì)各列的查詢);
cmdTableDirect ...CommandText使用“表名”連接
(內(nèi)部不做SQL ,而是真正的表名連接);
cmdtext ....使用SQL命令文本;
cmdfile ....CommandType屬性值作為持久的文件名;
cmdStoredProc...CommandType屬性值作為存儲(chǔ)過程名稱
來計(jì)算;
cmdUnKnown ....不知道(默認(rèn)為SQL)
CommandText
根據(jù)CommandType的設(shè)置,向提供者發(fā)出“表名”或SQL 命令。
第六節(jié) TADOCommand對(duì)象
在ADO 的層次結(jié)構(gòu)中,Command對(duì)象和RecordSet是處在同一層上,它主要用來對(duì)數(shù)劇源執(zhí)行指定的命令,比如SQL 語句,表和存儲(chǔ)過程的名稱、更新數(shù)據(jù),插入紀(jì)錄等。雖然其它的控件也能執(zhí)行這些方法,但需要遇到需要用Command 本身的屬性和方法來控制數(shù)據(jù)源的時(shí)候,利用這個(gè)對(duì)象將是十分方便的事情。
主要屬性:
CommandType
CommandText
Cancel
和上面介紹的相同
Assign(Source:Tpersistent)
把另一個(gè)ADOCommand 組件的所有屬性復(fù)制到當(dāng)前的ADOCommand組件中,調(diào)用的時(shí)候按名存取組件對(duì)象。
下面的例子可以看到ADOConnection、TADOCommand、ADODataSet、DataSource和其它數(shù)據(jù)綁定控件是如何作用的。
放入控件
ADOConnection
TADOCommand
ADODataSet
DataSource
Memo
DBgrid
Button
屬性(注意一下TADOCommand1和ADODataSet1的關(guān)系是平等的):
ADOConnection1---ConnctionString=連接字符串
TADOCommand1-----Connection=ADOConnection1
commandType=cmdText
ADODataSet1 -----Connection=ADOConnection1
commandType=cmdText
DataSource1 -----DataSet=ADODataSet1
Memo1 -----------List=空
DBgrid1----------DataSource=DataSource1
Button1的Click事件過程
procedure TForm1.Button1Click(Sender: TObject);
var str1,str2:string;
begin
//取出輸入的SQL 語言
str1:=trim(Memo1.text);
//由于執(zhí)行SQL語言時(shí),除了select ,其它諸如Insert,Delete,Update都需要事先關(guān)閉數(shù)
//據(jù)集,所以下面把前六個(gè)字符取出來作為判斷的依據(jù)。
str2:=copy(str1,0,6);
ADOCommand1.CommandText:=str1; //ADOCommand1執(zhí)行命令
//檢查用戶是否送入的是select語句
if str2='select' then
begin
ADODataset1.Recordset:=ADOCommand1.Execute;
ADODataset1.Open;
end
else
begin
//先關(guān)閉數(shù)據(jù)集
ADODataset1.Close;
//這是另一種執(zhí)行SQL 命令的方法,執(zhí)行delete等操作
ADOCommand1.Execute;
//按全部字段送入SQL
ADODataset1.CommandText:='select * from 獎(jiǎng)金';
ADODataset1.Open; //重新打開
end;
end;
第七節(jié) TADOStoredProc對(duì)象
當(dāng)應(yīng)用程序必須使用數(shù)據(jù)庫中的存儲(chǔ)過程的時(shí)候,也可以使用ADOStoredProc 控件。
一個(gè)存儲(chǔ)過程是一組語句,提前建立好保存在數(shù)據(jù)庫服務(wù)器上,可以反復(fù)被執(zhí)行,在服務(wù)器上完成和數(shù)據(jù)庫有關(guān)的任務(wù),并將結(jié)果傳給用戶。
許多存儲(chǔ)過程在運(yùn)行時(shí)還需要一系列的參數(shù),可以通過Parameters屬性來設(shè)置,這個(gè)數(shù)據(jù)集和其它的ADO 數(shù)據(jù)集相似,可完成類似的任務(wù)。
主要屬性:
Active 設(shè)為true時(shí)激活數(shù)據(jù)集;
Connection 如果應(yīng)用程序添加了ADOConnection,可以在這里連接;
ConnectionString 如果沒有Connection屬性,可以在這里做連接字符串;
DataSource 設(shè)置另一個(gè)數(shù)據(jù)源,一般不要設(shè)置,事實(shí)上如果這樣做Delphi會(huì)報(bào)錯(cuò);
Filter 設(shè)置篩選紀(jì)錄的條件;
Filtered 決定是否激活Filter中設(shè)置的篩選條件;
Parameters 設(shè)置存儲(chǔ)過程中使用參數(shù)的屬性;
ProcedureName 設(shè)置數(shù)據(jù)集使用存儲(chǔ)過程的名字,可以用下拉菜單選擇。
主要方法
DeleteRecords 刪除一條或多條紀(jì)錄
Edit 設(shè)置數(shù)據(jù)集為編輯狀態(tài)
EnableCountrols 使數(shù)據(jù)綁定控件顯示數(shù)據(jù)
DisableCountrols 使數(shù)據(jù)綁定控件不顯示數(shù)據(jù)
First 指針指向第一條紀(jì)錄
Last 指針指向最后一條紀(jì)錄
Prior 指針指向上一條紀(jì)錄
Next 指針指向下一條紀(jì)錄
MoveBy(n) 指針指向前或后的第n 條紀(jì)錄
GetFieldData 把一個(gè)字段的當(dāng)前值提取到緩存中去
IsEmpty 判斷一個(gè)數(shù)據(jù)集是否為空
Open 打開一個(gè)數(shù)據(jù)集
Refresh 重新從數(shù)據(jù)庫中提取數(shù)據(jù)更新數(shù)據(jù)集
ADOStoredProc的主要的事件與ADOQuery基本相同,可以參考使用。
第八節(jié) 主從結(jié)構(gòu)的數(shù)據(jù)庫應(yīng)用程序
主從結(jié)構(gòu)的數(shù)據(jù)庫應(yīng)用程序,是屬于數(shù)據(jù)庫的高級(jí)應(yīng)用技術(shù),下面我們通過一個(gè)實(shí)例來說明建立這種數(shù)據(jù)庫應(yīng)用程序的方法。
1)建立主從結(jié)構(gòu)
加入 ADOTabl1:
屬性
Connectionstring=連接字符串
Tablename=表名
Active=true 激活
加入 Datasource1
屬性
DataSet=ADOTable1
連接上主表,做上有關(guān)的綁定控件
下面做從表
加入 ADOTabl2:
屬性
Connectionstring=連接字符串
Tablename=表名
Active=true 激活
下面是做主從表的關(guān)鍵(在ADOTabl2中)
MasterSource=DataSource1
MasterFields=連接字段
(點(diǎn)..出現(xiàn)對(duì)話框,選中兩個(gè)表的連接字段,Add 加入,Ok)
這就完成了主從表的連接
加入 Datasource2
屬性
DataSet=ADOTable2
連接綁定控件
觀察主從表的工作情況,這個(gè)方法幾乎對(duì)所有的Delphi數(shù)據(jù)庫控件都是適用的。
第九節(jié) BDE 的應(yīng)用
BDE 是Borland開發(fā)的最成熟的數(shù)據(jù)控制對(duì)象集,它對(duì)于像Oracle這些第三方數(shù)據(jù)庫,由于是直接由開發(fā)商提供了驅(qū)動(dòng)程序,所以執(zhí)行效率比較高,到現(xiàn)在仍然受到不少程序員的歡迎。
它里面主要是table和Query兩個(gè)數(shù)據(jù)源控件。從性能和使用方法都和ADOtable和ADOQuery 相似的(Recordset屬性和方法除外,這是ADO 特有的)值得注意的是,它們連接數(shù)據(jù)源的方式采用了別名,也就是應(yīng)用的時(shí)候事先一定要設(shè)計(jì)好ODBC數(shù)據(jù)源,并給定數(shù)據(jù)源一個(gè)別名。
屬性
DatabaseName=別名
在table中,TableName=表名
在Query中,SQL=SQL命令
然后
Active=true
就連接上了。
ODBC數(shù)據(jù)源的別名,實(shí)際上是寫入計(jì)算機(jī)的注冊(cè)表的,所以如果希望通過程序來設(shè)置別名,可以通過程序直接改寫注冊(cè)表來解決,具體請(qǐng)看實(shí)例。
一、Ttable組件
該組件用來表示數(shù)據(jù)庫的一個(gè)基表,它的主要屬性如下:
DatabasName:數(shù)據(jù)源的名字
TableName: 表的名字
Active: true表示活動(dòng)
Filter: 數(shù)據(jù)篩選
Filtered: 控制Filter的使用,F(xiàn)alse則篩選不起作用。
FilterOptions:其中包括兩個(gè)選項(xiàng)
foCaseInsensitive 決定是否嚴(yán)格按照Filter條件中大小寫匹配查詢,true為大小寫匹配。
foNoPartialCompare
“*”是否作為數(shù)字統(tǒng)配符存在,true 則視為單個(gè)字符,false則視為統(tǒng)配符。
IndexFieldNames 設(shè)置那些字段進(jìn)行記錄的排序,逗號(hào)間隔,這些字段必須是關(guān)鍵字端。
IndexName 設(shè)置基表的第二個(gè)索引字段,如果這個(gè)屬性是空的,則基表按默認(rèn)索引排序。
MasterSource 在主從表關(guān)系中,設(shè)置從表關(guān)聯(lián)的主表對(duì)應(yīng)數(shù)據(jù)源。
MasterFields
別名和表名調(diào)用的實(shí)例:
-----------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables;
type
TForm1 = class(TForm)
Database1: TDatabase;
Session1: TSession;
Table1: TTable;
Button1: TButton;
ComboBox1: TComboBox;
ListBox1: TListBox;
Label1: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
DBNames: TStrings;
begin
DBNames := TStringList.Create;
//Session1.GetDatabaseNames(DBNames);
Session1.GetdatabaseNames(DBNames);
for I := 0 to DBNames.Count - 1 do
ComboBox1.Items.Add(DBNames[I]);
Database1.GetTableNames(ListBox1.Items, False);
end;
{ADOConnection1.GetTableNames(ListBox2.Items, False);
Database1.GetTableNames(ListBox1.Items, False);}
procedure TForm1.Button2Click(Sender: TObject);
begin
Database1.Close;
Database1.AliasName:= ComboBox1.Text;
Database1.Open;
ListBox1.Clear;
Database1.GetTableNames(ListBox1.Items, False);
end;
end.
-----------------------------------------------------------------------
第十節(jié) 開發(fā)InterBase應(yīng)用程序
InterBase數(shù)據(jù)庫是Borland公司開發(fā)的數(shù)據(jù)庫產(chǎn)品,在Borland產(chǎn)品得到廣泛的應(yīng)用。該數(shù)據(jù)庫是Delphi和Kylix(被稱作Linux下的Delphi)開發(fā)的跨平臺(tái)應(yīng)用程序可用的數(shù)據(jù)庫之一(其它還有Qracle、MySQL、DB2)。InterBase 有與Delphi結(jié)合緊密的特點(diǎn),而且,在Delphi安裝盤中。還提供了InterBase 數(shù)據(jù)服務(wù)和客戶端軟件,可以方便的構(gòu)筑InterBase數(shù)據(jù)庫的開發(fā)環(huán)境。
InterBase 的組件都放在InterBase面板中,從使用方法上來說,和上面介紹的BDE 或者ADO 相似,可以自己查閱有關(guān)資料。
這里就不再討論了。
第十一節(jié) dbExpress數(shù)據(jù)庫控制
dbExpress 是Delphi 6.0 新加的功能,dbExpress是一個(gè)跨平臺(tái)的、不依賴于數(shù)據(jù)庫的一個(gè)獨(dú)立的層。它提供了一些方法用于動(dòng)態(tài)SQL的處理。它定義了一個(gè)接口用于訪問不同的SQL 服務(wù)器,并為各種數(shù)據(jù)庫提供了驅(qū)動(dòng)程序。
這些驅(qū)動(dòng)程序在Windows和Linux下都能使用(Windows下為動(dòng)態(tài)連接庫.DLL,而在Linux下為共享對(duì)象.so文件)。 這種API 驅(qū)動(dòng),減少了數(shù)據(jù)庫引擎需要的額外開銷。
標(biāo)準(zhǔn)的dbExpress數(shù)據(jù)庫應(yīng)用是不使用數(shù)據(jù)緩存的,由于保持核心運(yùn)行時(shí)數(shù)據(jù)庫訪問層的簡單和輕便。所以,dbExpress提供了高性能的數(shù)據(jù)庫連接,運(yùn)行速度很高。但是,不用數(shù)據(jù)緩存將無法修改數(shù)據(jù),而且,指針的移動(dòng)也是單向的。為了能夠修改數(shù)據(jù),dbExpress也提供了一種使用數(shù)據(jù)緩存的控件,當(dāng)然這無疑也會(huì)影響到效率。
目前在dbExpress能夠應(yīng)用的數(shù)據(jù)庫有Qracle、MySQL、DB2和InterBase,這里以InterBase 數(shù)據(jù)庫為例。
一、單向的數(shù)據(jù)連接
實(shí)例數(shù)據(jù)庫為Delphi提供的Employee.gdb。
1)加入 TSQLConnection
屬性:
LoginPrompt=False 不用用戶名和密碼顯示
DirverName=InterBase 驅(qū)動(dòng)程序名
ConnectionName=IBLoca 默認(rèn)數(shù)據(jù)庫(Database.gdb)
Params 點(diǎn)對(duì)話框出現(xiàn)信息表,修改數(shù)據(jù)庫的名字Employee.gdb
Connected=true 如果連接正確,將可以順利的為true;
2)加入 TSQLDataset
屬性:
SQLConnection=SQLConnection名字
CommandType=ctTable 用表名連接
CommandText=表名
Active=true 如果正確,將可以為true;
3)加入 TDataSource
屬性:
DataSet=SQLDataSet名字
4)加入數(shù)據(jù)綁定控件,由于不用緩存,所以不能用DBGrid,這里只用簡單的DBEdit。
注意屬性:
DataSource=DataSource名字
DataField=字段名
5)注意,SQLDataset移動(dòng)指針只有兩個(gè)方法
SQLdataset1.Next;
SQLdataset1.First;
這就可以運(yùn)行了。
二、可以修改的數(shù)據(jù)連接
做一個(gè)主從結(jié)構(gòu)的數(shù)據(jù)顯示,要求從表是可以修改的,而且要用DBGrid,所以,這里要用一個(gè)新的控件來聯(lián)系:
TSQLClientDataSet
和TSQLDataset不同TSQLClientDataSet是使用數(shù)據(jù)緩沖區(qū)的,所以,用它連接數(shù)據(jù)源可以修改,也可以用DBGrid顯示。
和上面方法相同,加入TSQLConnection作數(shù)劇源。
屬性:
LoginPrompt=False 不用用戶名和密碼顯示
DirverName=InterBase 驅(qū)動(dòng)程序名
ConnectionName=IBLoca 默認(rèn)數(shù)據(jù)庫(Database.gdb)
Params 點(diǎn)對(duì)話框出現(xiàn)信息表,改數(shù)據(jù)庫名:Employee.gdb
Connected=true 如果連接正確,將可以順利的為true;
1)做主表
加入 TSQLDataset
屬性:
SQLConnection=SQLConnection1
CommandType=ctTable 用表名連接
CommandText=PROJECT (這是在Employee.gdb內(nèi)的一個(gè)表)
Active=true 如果正確,將可以為true;
加入 TDataSource
屬性:
DataSet=SQLDataSet1
加入數(shù)據(jù)綁定控件兩個(gè)DBEdit,顯示字段分別為PROJ_ID和PROJ_NAME。
用同樣的方法作兩個(gè)指針移動(dòng)的Button。
2)做從表
加入TSQLClientDataSet
屬性:
SQLConnection=SQLConnection1
CommandType=ctTable 用表名連接
CommandText=PROJ_DEPT_BUDGET (這是在Employee.gdb內(nèi)的另一個(gè)表)
Active=true (激活)
做主從連接
MasterSource=DataSource1
MasterFierds=PROJ_ID (連接字段)
加入 TDataSource
屬性:
Name=DataSource2
DataSet=SQLClientDataSet1
加入DBGrid,與DataSource2連接。
這就完成了一個(gè)主從表制作,試驗(yàn)一下,可以發(fā)現(xiàn)從表是可以修改的。
仔細(xì)研究一下這個(gè)過程,歸納出設(shè)計(jì)的一般方法。一般來說,dbExpress主要在網(wǎng)絡(luò)中使用,特別是后面將要提到的WebSnap 快速網(wǎng)絡(luò)開發(fā)方法,將會(huì)給dbExpress 以很大的施展空間。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。