摘要 事務(wù)控制是數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中的關(guān)鍵技術(shù)之一,本文一開(kāi)始先對(duì)事務(wù)控制的概念以及微軟的 ActiveX 數(shù)據(jù)對(duì)象( ADO )的事務(wù)控制做了簡(jiǎn)介,之后以一個(gè)具體的實(shí)例給出ActiveX數(shù)據(jù)對(duì)象的事務(wù)控制在VB和DELPHI中的使用方法。 關(guān)鍵詞 ActiveX數(shù)據(jù)對(duì)象(ADO);事務(wù)
摘要 事務(wù)控制是數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中的關(guān)鍵技術(shù)之一,本文一開(kāi)始先對(duì)事務(wù)控制的概念以及微軟的 ActiveX數(shù)據(jù)對(duì)象(ADO)的事務(wù)控制做了簡(jiǎn)介,之后以一個(gè)具體的實(shí)例給出ActiveX數(shù)據(jù)對(duì)象的事務(wù)控制在VB和DELPHI中的使用方法。
關(guān)鍵詞 ActiveX數(shù)據(jù)對(duì)象(ADO);事務(wù)控制;VB;DELPHI
1 引言
在數(shù)據(jù)庫(kù)的應(yīng)用中,有時(shí)會(huì)遇到以獨(dú)立單元保存或取消對(duì)源數(shù)據(jù)所做的一系列更改。例如在貨幣轉(zhuǎn)帳時(shí),必須從帳戶(hù)中減去某個(gè)數(shù)額并將其對(duì)等數(shù)額添加到另一個(gè)帳戶(hù)。無(wú)論其中的哪個(gè)更新失敗,都將導(dǎo)致帳戶(hù)收支不平衡。再如,在進(jìn)行商品庫(kù)存管理時(shí),當(dāng)發(fā)生購(gòu)進(jìn)或售出商品時(shí),一方面要在商品的銷(xiāo)售表中保存該商品的銷(xiāo)售記錄,另一方面,還要在商品庫(kù)存中對(duì)該種商品的庫(kù)存進(jìn)行調(diào)整。無(wú)論其中的哪個(gè)更新失敗,都將導(dǎo)致商品收支不平衡。在這種情況下,必須通過(guò)事務(wù)控制來(lái)保證操作的一致性。
2 ActiveX數(shù)據(jù)對(duì)象事務(wù)控制
2.1 ActiveX數(shù)據(jù)對(duì)象(ADO)簡(jiǎn)介
Microsoft ActiveX Data Objects(ADO)是Microsoft開(kāi)發(fā)的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象,它可使用戶(hù)通過(guò)何OLE DB Provider 訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù)。ADO趨向于提供一種穩(wěn)定的接口,來(lái)使用戶(hù)利用多種不同的數(shù)據(jù)源包括從非關(guān)系型數(shù)據(jù)源(包括文本文件、電子郵件等)到ODBC關(guān)系型數(shù)據(jù)庫(kù)。所以它是對(duì)ODBC的擴(kuò)充。
ADO的主要優(yōu)點(diǎn)是使用簡(jiǎn)單,快速,內(nèi)存消耗量低,磁盤(pán)的占有量少,在關(guān)鍵
情況下網(wǎng)絡(luò)的通信量最少,前端與數(shù)據(jù)存儲(chǔ)之間的層次最少,是一種輕便質(zhì)優(yōu)的接口。
2.2 ActiveX數(shù)據(jù)對(duì)象(ADO)事務(wù)控制
BeginTrans、CommitTrans和RollbackTrans是ADOConnection部件供數(shù)據(jù)庫(kù)應(yīng)用程序在運(yùn)行時(shí)調(diào)用開(kāi)始事務(wù)、控制并保存或放棄所做數(shù)據(jù)修改的方法。
l BeginTrans 開(kāi)始一個(gè)事務(wù)
當(dāng)開(kāi)始一個(gè)事務(wù)時(shí),后來(lái)所有讀寫(xiě)數(shù)據(jù)庫(kù)的操作都發(fā)生在這次事務(wù)的環(huán)境中,直到本次事務(wù)通過(guò)調(diào)用CommitTrans或RollbackTrans來(lái)顯示的終止為止。還以商品管理為例,當(dāng)購(gòu)進(jìn)或售出商品時(shí),在商品數(shù)據(jù)庫(kù)記錄上必須發(fā)生兩個(gè)修改:
A、購(gòu)進(jìn)或銷(xiāo)售的記錄必須記錄在銷(xiāo)售表中;
B、在商品庫(kù)存中對(duì)該類(lèi)商品的庫(kù)存進(jìn)行調(diào)整。
如果出于某種原因,其中的一個(gè)操作不能被完成,那么任何一個(gè)操作都不應(yīng)該發(fā)生。因?yàn)檫@些操作是相關(guān)的,它們發(fā)生在同一個(gè)事務(wù)中。
l RollbackTrans 取消事務(wù)中的修改并終止當(dāng)前事務(wù)
為了取消對(duì)數(shù)據(jù)庫(kù)所做的修改,必須用RolllbackTrans方法返回一個(gè)事務(wù)。RollbackTrans方法取消當(dāng)前事務(wù)中對(duì)數(shù)據(jù)庫(kù)所做的修改并終止當(dāng)前事務(wù)。
l CommitTrans 提交一個(gè)事務(wù)
為了做永久性的修改,必須CommitTrans方法提交事務(wù),這將保存用戶(hù)對(duì)數(shù)據(jù)庫(kù)所做的修改并結(jié)束當(dāng)前事務(wù)。
在VB 6.0中,ADO成為它與各種數(shù)據(jù)源的缺省接口,ADO數(shù)據(jù)訪(fǎng)問(wèn)方式是現(xiàn)在和未來(lái)VB乃至Microsoft的各種應(yīng)用軟件進(jìn)行數(shù)據(jù)訪(fǎng)問(wèn)與應(yīng)用的主流。
而在DELPHI中,基于DBE(Borland Database Engine的簡(jiǎn)稱(chēng),即Borland數(shù)據(jù)庫(kù)引擎)的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)方式是DELPHI的標(biāo)準(zhǔn)的、傳統(tǒng)的方式;基于ADO技術(shù)的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)方式,這是DELPHI 5.0新增的功能。DELPHI 5.0 提供了一整套ADO組件,封裝了ADO框架的所有功能。
下面以商品庫(kù)存管理來(lái)分別闡明ADOConnection的事務(wù)控制在VB和DELPHI中的應(yīng)用。
3 商品庫(kù)存管理中的數(shù)據(jù)庫(kù)
該數(shù)據(jù)庫(kù)GoodsManagement用Microsoft的SQL Server創(chuàng)建,包括三個(gè)用戶(hù)數(shù)據(jù)表,用戶(hù)表Users、庫(kù)存表Goods、進(jìn)銷(xiāo)表InOutGoods,每個(gè)數(shù)據(jù)表的表結(jié)構(gòu)如下:
l 用戶(hù)表Users
字段名 數(shù)據(jù)類(lèi)型 長(zhǎng)度
用戶(hù)名 VARCHAR 8
用戶(hù)類(lèi)型 VARCHAR 10
用戶(hù)口令 VARCHAR 6
主鍵為: 用戶(hù)名
注:
用戶(hù)類(lèi)型有一般用戶(hù)和系統(tǒng)管理員兩種,其中一般用戶(hù)只能進(jìn)行銷(xiāo)售商品,碉系統(tǒng)管理員還可以增加或刪除用戶(hù),由于本文章只是闡述ADOConnection的事務(wù)控制,所以也就涉及到用戶(hù)管理。
l 庫(kù)存表Goods
字段名 數(shù)據(jù)類(lèi)型 長(zhǎng)度
商品名 VARCHAR 14
商品描述 VARCHAR 16
商品庫(kù)存 SMALLINT 2
主鍵為:商品名
l 進(jìn)銷(xiāo)表InOutGoods
字段名 數(shù)據(jù)類(lèi)型 長(zhǎng)度
進(jìn)銷(xiāo) VARCHAR 2
商品名稱(chēng) VARCHAR 14
商品數(shù)量 SMALLINT 2
商品價(jià)格 MONEY 8
操作人員 VARCHAR 8
操作時(shí)間 DATETIME 8
主鍵為:(操作人員,操作時(shí)間)
外鍵為:操作人員,對(duì)應(yīng)于Users表的用戶(hù)名
4 ADO事務(wù)控制應(yīng)用〈〈商品庫(kù)存管理〉〉在VB中的實(shí)現(xiàn)
4.1 數(shù)據(jù)環(huán)境設(shè)計(jì)器
圖1 數(shù)據(jù)環(huán)境設(shè)計(jì)器
數(shù)據(jù)環(huán)境設(shè)計(jì)器中主要控件的屬性如下:
控件名 控件類(lèi)型 重要屬性設(shè)置
CN ADOConnection對(duì)象 ConnectSource如下:
Provider=SQLOLEDB.1;Password=SA;Persist Security Info=True;User ID=sa;
Initial Catalog=GoodsManagement
Goods ADOCommand對(duì)象 ConnectionName:CN
CommandText:Goods
InOutGoods ADOCommand對(duì)象 ConnectionName:CN
CommandText:Goods
StrSQL ADOCommand對(duì)象 ConnectionName:CN
CommandText:Goods
4.2 進(jìn)庫(kù)管理模塊的代碼
下面就以其中的一個(gè)程序段“進(jìn)庫(kù)管理”來(lái)說(shuō)明ADO數(shù)據(jù)對(duì)象如何實(shí)現(xiàn)事務(wù)管理。
Dim intNum1, intNum2 As Integer ? ‘開(kāi)始一個(gè)事務(wù) DE.Cn.BeginTrans With DE.rsInOutGoods ‘寫(xiě)入購(gòu)進(jìn)商品的記錄 .AddNew .Fields(0).Value = "進(jìn)" .Fields(1).Value = TxtName.Text .Fields(2).Value = CInt(TxtNumber.Text) .Fields(3).Value = CInt(TxtPrice.Text) .Fields(4).Value = G_userName .Fields(5).Value = CStr(Now) . .Update End With If DE.rsStrSQL.State = adStateOpen Then DE.rsStrSQL.Close End If
‘求進(jìn)銷(xiāo)表中商品名為T(mén)xtNumber.Text且為進(jìn)的所有記錄的進(jìn)貨數(shù)量之和
With DE.rsStrSQL .Open "select sum(商品數(shù)量) from InOutGoods where 進(jìn)銷(xiāo)='進(jìn)'" & " and 商品名稱(chēng)='" & TxtName.Text & "'" intNum1 = .Fields(0).Value .Close End With
‘求進(jìn)銷(xiāo)表中商品名為T(mén)xtName.Text且為銷(xiāo)的所有記錄的進(jìn)貨數(shù)量之和
With DE.rsStrSQL
.Open "select sum(商品數(shù)量) from InOutGoods where 進(jìn)銷(xiāo)='銷(xiāo)'" & " and
商品名稱(chēng)='" & TxtName.Text & "'"
If .RecordCount = 1 And IsNull(.Fields(0).Value) Then intNum2 = 0 Else intNum2 = .Fields(0) End If .Close End With
‘調(diào)整商品庫(kù)存中該商品的庫(kù)存量
DE.Cn.Execute "update Goods set 商品庫(kù)存=" & (intNum1 - intNum2) & " where 商品名='" & TxtName.Text & "'"
‘向數(shù)據(jù)庫(kù)提交事務(wù)
D【本文來(lái)自鴻網(wǎng)互聯(lián) (http://www.68idc.cn)】E.Cn.CommitTrans
?
5 ADO事務(wù)控制應(yīng)用〈〈商品庫(kù)存管理〉〉在DELPHI中的實(shí)現(xiàn)
5.1 系統(tǒng)中的數(shù)據(jù)模塊
數(shù)據(jù)模塊窗體主要控件的屬性如下:
控件名 控件類(lèi)型 重要屬性設(shè)置
ADOCn ADOConnection對(duì)象 ConnectSource :(同前)
ADODatasetGoods 數(shù)據(jù)集部件ADODataset ConnectionName:ADOCN
CommandText:Goods
ADODatasetInOutGoods 數(shù)據(jù)集部件ADODataset ConnectionName:ADOCN
CommandText:Goods
ADODataset1 數(shù)據(jù)集部件ADODataset ConnectionName:ADOCN
CommandText:Goods
DataSourceGoods DataSource控件 Dataset:ADODatasetGoods
DataSourceInOutGoods DataSource控件 Dataset:ADODatasetInOutGoods
5.2 進(jìn)庫(kù)管理模塊的代碼
下面就以其中的一個(gè)程序段“進(jìn)庫(kù)管理”來(lái)說(shuō)明ADO數(shù)據(jù)對(duì)象如何實(shí)現(xiàn)事務(wù)管理。
var strSQL:string; intNum1,intNum2,intRecordsAffected:integer; begin ? //啟動(dòng)事務(wù)控制 DM.ADOCn.BeginTrans; //向進(jìn)銷(xiāo)表插入一條記錄 with DM.ADODataSetInOutGoods do begin insert; fields[0].Value:='進(jìn)'; fields[1].Value:= editName.text; fields[2].AsString:=editNumber.text; fields[3].AsString:=editPrice.text; fields[4].Value:=G_UserName; fields[5].AsString :=DateTimeToStr(now); Post; end; //求進(jìn)銷(xiāo)表中商品名為editName.text且為進(jìn)的所有記錄的進(jìn)貨數(shù)量之和 strSQL:='select sum(商品數(shù)量) from InOutGoods where 進(jìn)銷(xiāo)=''進(jìn)'' and 商品名稱(chēng)='''+editName.text+''''; with DM.ADODataSet1 do begin Close; CommandText:=strSQL; Open; end; intNum1:=DM.ADODataSet1.Fields[0].Value ; //求進(jìn)銷(xiāo)表中商品名為editName.text且為銷(xiāo)的所有記錄的進(jìn)貨數(shù)量之和 strSQL:='select sum(商品數(shù)量) from InOutGoods where 進(jìn)銷(xiāo)=''銷(xiāo)'' and 商品名稱(chēng)='''+editName.text+''''; with DM.ADODataSet1 do begin Close; CommandText:=strSQL; Open; end; if (DM.ADODataSet1.RecordCount=1) and DM.ADODataSet1.Fields[0].Value=null) then IntNum2:=0 else intNum2:=DM.ADODataSet1.Fields[0].value; strSQL:='update Goods set 商品庫(kù)存='+intToStr(intNum1-intNum2) +' where 商品名='''+editName.Text+''''; DM.ADOCn.Execute (strSQL,intRecordsAffected,[eoExecuteNoRecords]) ; DM.ADOCn.Execute(strSQL,intRecordsAffected,[eoExecuteNoRecords]) ; DM.ADOCn.CommitTrans ; ?
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com