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