本文發表在中國人民解放軍“信息工程大學”學報 2001年第3期。
ActiveX數據對象之事務控制在VB和DELPHI中的應用
馬根峯1 , 孫豔2 , 宋偉1
( 1.重慶郵電學院 ,重慶,400065 ;2. 鐵道部第十九工程局四處,通遼,028000 )
摘要 事務控制是數據庫應用系統中的關鍵技術之一,本文一開始先對事務控制的概念以及微軟的 ActiveX數據對象(ADO)的事務控制做了簡介,之後以一個具體的實例給出ActiveX數據對象的事務控制在VB和DELPHI中的使用方法。
關鍵詞 ActiveX數據對象(ADO);事務控制;VB;DELPHI
1 引言
在數據庫的應用中,有時會遇到以獨立單元保存或取消對源數據所做的一系列更改。例如在貨幣轉帳時,必須從帳戶中減去某個數額並將其對等數額添加到另一個帳戶。無論其中的哪個更新失敗,都將導致帳戶收支不平衡。再如,在進行商品庫存管理時,當發生購進或售出商品時,一方面要在商品的銷售表中保存該商品的銷售記錄,另一方面,還要在商品庫存中對該種商品的庫存進行調整。無論其中的哪個更新失敗,都將導致商品收支不平衡。在這種情況下,必須通過事務控制來保證操作的一致性。
2 ActiveX數據對象事務控制
2.1 ActiveX數據對象(ADO)簡介
Microsoft ActiveX Data Objects(ADO)是Microsoft開發的數據訪問對象,它可使用戶通過何OLE DB Provider 訪問數據庫服務器中的數據。ADO趨向於提供一種穩定的接口,來使用戶利用多種不同的數據源包括從非關係型數據源(包括文本文件、電子郵件等)到ODBC關係型數據庫。所以它是對ODBC的擴充。
ADO的主要優點是使用簡單,快速,內存消耗量低,磁盤的佔有量少,在關鍵
情況下網絡的通信量最少,前端與數據存儲之間的層次最少,是一種輕便質優的接口。
2.2 ActiveX數據對象(ADO)事務控制
BeginTrans、CommitTrans和RollbackTrans是ADOConnection部件供數據庫應用程序在運行時調用開始事務、控制並保存或放棄所做數據修改的方法。
l BeginTrans 開始一個事務
當開始一個事務時,後來所有讀寫數據庫的操作都發生在這次事務的環境中,直到本次事務通過調用CommitTrans或RollbackTrans來顯示的終止爲止。還以商品管理爲例,當購進或售出商品時,在商品數據庫記錄上必鬚髮生兩個修改:
A、購進或銷售的記錄必須記錄在銷售表中;
B、在商品庫存中對該類商品的庫存進行調整。
如果出於某種原因,其中的一個操作不能被完成,那麼任何一個操作都不應該發生。因爲這些操作是相關的,它們發生在同一個事務中。
l RollbackTrans 取消事務中的修改並終止當前事務
爲了取消對數據庫所做的修改,必須用RolllbackTrans方法返回一個事務。RollbackTrans方法取消當前事務中對數據庫所做的修改並終止當前事務。
l CommitTrans 提交一個事務
爲了做永久性的修改,必須CommitTrans方法提交事務,這將保存用戶對數據庫所做的修改並結束當前事務。
在VB 6.0中,ADO成爲它與各種數據源的缺省接口,ADO數據訪問方式是現在和未來VB乃至Microsoft的各種應用軟件進行數據訪問與應用的主流。
而在DELPHI中,基於DBE(Borland Database Engine的簡稱,即Borland數據庫引擎)的數據庫訪問方式是DELPHI的標準的、傳統的方式;基於ADO技術的數據庫訪問方式,這是DELPHI 5.0新增的功能。DELPHI 5.0 提供了一整套ADO組件,封裝了ADO框架的所有功能。
下面以商品庫存管理來分別闡明ADOConnection的事務控制在VB和DELPHI中的應用。
3 商品庫存管理中的數據庫
該數據庫GoodsManagement用Microsoft的SQL Server創建,包括三個用戶數據表,用戶表Users、庫存表Goods、進銷表InOutGoods,每個數據表的表結構如下:
l 用戶表Users
字段名 數據類型 長度
用戶名 VARCHAR 8
用戶類型 VARCHAR 10
用戶口令 VARCHAR 6
主鍵爲: 用戶名
注:
用戶類型有一般用戶和系統管理員兩種,其中一般用戶只能進行銷售商品,碉系統管理員還可以增加或刪除用戶,由於本文章只是闡述ADOConnection的事務控制,所以也就涉及到用戶管理。
l 庫存表Goods
字段名 數據類型 長度
商品名 VARCHAR 14
商品描述 VARCHAR 16
商品庫存 SMALLINT 2
主鍵爲:商品名
l 進銷表InOutGoods
字段名 數據類型 長度
進銷 VARCHAR 2
商品名稱 VARCHAR 14
商品數量 SMALLINT 2
商品價格 MONEY 8
操作人員 VARCHAR 8
操作時間 DATETIME 8
主鍵爲:(操作人員,操作時間)
外鍵爲:操作人員,對應於Users表的用戶名
4 ADO事務控制應用〈〈商品庫存管理〉〉在VB中的實現
4.1 數據環境設計器
圖1 數據環境設計器
數據環境設計器中主要控件的屬性如下:
控件名 控件類型 重要屬性設置
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數據對象如何實現事務管理。
Dim intNum1, intNum2 As Integer
¼
‘開始一個事務
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且爲進的所有記錄的進貨數量之和
With DE.rsStrSQL
.Open "select sum(商品數量) from InOutGoods where 進銷='進'" & " and 商品名稱='" & TxtName.Text & "'"
intNum1 = .Fields(0).Value
.Close
End With
‘求進銷表中商品名爲TxtName.Text且爲銷的所有記錄的進貨數量之和
With DE.rsStrSQL
.Open "select sum(商品數量) 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
‘調整商品庫存中該商品的庫存量
DE.Cn.Execute "update Goods set 商品庫存=" & (intNum1 - intNum2) & " where 商品名='" & TxtName.Text & "'"
‘向數據庫提交事務
DE.Cn.CommitTrans
¼
5 ADO事務控制應用〈〈商品庫存管理〉〉在DELPHI中的實現
5.1 系統中的數據模塊
圖2 數據模塊窗體
數據模塊窗體主要控件的屬性如下:
控件名 控件類型 重要屬性設置
ADOCn ADOConnection對象 ConnectSource :(同前)
ADODatasetGoods 數據集部件ADODataset ConnectionName:ADOCN
CommandText:Goods
ADODatasetInOutGoods 數據集部件ADODataset ConnectionName:ADOCN
CommandText:Goods
ADODataset1 數據集部件ADODataset ConnectionName:ADOCN
CommandText:Goods
DataSourceGoods DataSource控件 Dataset:ADODatasetGoods
DataSourceInOutGoods DataSource控件 Dataset:ADODatasetInOutGoods
5.2 進庫管理模塊的代碼
下面就以其中的一個程序段“進庫管理”來說明ADO數據對象如何實現事務管理。
var
strSQL:string;
intNum1,intNum2,intRecordsAffected:integer;
begin
¼
//啓動事務控制
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且爲進的所有記錄的進貨數量之和
strSQL:='select sum(商品數量) from InOutGoods where 進銷=''進''
and 商品名稱='''+editName.text+'''';
with DM.ADODataSet1 do begin
Close;
CommandText:=strSQL;
Open;
end;
intNum1:=DM.ADODataSet1.Fields[0].Value ;
//求進銷表中商品名爲editName.text且爲銷的所有記錄的進貨數量之和
strSQL:='select sum(商品數量) 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 ;
¼
參考文獻:
[1](美) Jeffrey P. McManus · Database Access With Visual Basic 6 · 北京 :
機械工業出版社,1999.10
[2] (美) Steven Holzner · Visual Basic 6 Black Book · 北京 :機械工業出版社,1999.4
[3] 莫衛東,白鵬,張曉,張福萍 · Visual Basic 6.0 高級編程技巧----ADO數據訪問篇·
西安:西安交通大學出版社,2000.1
[4] 肖永順,劉韜,李生海,黃軍萬,黃亮 · DELPHI 程序設計· 北京:人民郵電出版社2000.5
[5] 房增華,徐遠超 · Delphi 5 數據庫編程實戰與精通 · 北京:清華大學出版社2000.7
The Application of the ActiveX Data Objects transaction control in Visual Basic & DELPHI
MA Gen-feng SUN Yan SONG Wei
Abstract Transaction control is one of the key technology in the database application system. Firstly, the thesis give a brief introduction to the conception of the transaction control and the ADO transaction control of Microsoft, then it shows how to use the transaction control in VB & DELPHI by a illustration。
Key words ActiveX數據對象(ADO);Transaction control;VB;DELPHI