ActiveX數據對象之事務控制在VB和DELPHI中的應用

 
       本文發表在中國人民解放軍“信息工程大學”學報 2001年第3期。


 

 
      ActiveX數據對象之事務控制在VBDELPHI中的應用
                     
馬根峯1   ,  孫豔2  , 宋偉1
                       
( 1.重慶郵電學院 ,重慶,400065 2. 鐵道部第十九工程局四處,通遼,028000  )
 

 

    摘要      事務控制是數據庫應用系統中的關鍵技術之一,本文一開始先對事務控制的概念以及微軟的 ActiveX數據對象(ADO)的事務控制做了簡介,之後以一個具體的實例給出ActiveX數據對象的事務控制在VBDELPHI中的使用方法。

    關鍵詞    ActiveX數據對象(ADO);事務控制;VBDELPHI

 


 

1     引言 

在數據庫的應用中,有時會遇到以獨立單元保存或取消對源數據所做的一系列更改。例如在貨幣轉帳時,必須從帳戶中減去某個數額並將其對等數額添加到另一個帳戶。無論其中的哪個更新失敗,都將導致帳戶收支不平衡。再如,在進行商品庫存管理時,當發生購進或售出商品時,一方面要在商品的銷售表中保存該商品的銷售記錄,另一方面,還要在商品庫存中對該種商品的庫存進行調整。無論其中的哪個更新失敗,都將導致商品收支不平衡。在這種情況下,必須通過事務控制來保證操作的一致性。

 


 

2     ActiveX數據對象事務控制 

2.1  ActiveX數據對象(ADO)簡介

       Microsoft ActiveX Data Objects(ADO)Microsoft開發的數據訪問對象,它可使用戶通過何OLE DB Provider 訪問數據庫服務器中的數據。ADO趨向於提供一種穩定的接口,來使用戶利用多種不同的數據源包括從非關係型數據源(包括文本文件、電子郵件等)到ODBC關係型數據庫。所以它是對ODBC的擴充。

ADO的主要優點是使用簡單,快速,內存消耗量低,磁盤的佔有量少,在關鍵

情況下網絡的通信量最少,前端與數據存儲之間的層次最少,是一種輕便質優的接口。
 

      2.2   ActiveX數據對象(ADO)事務控制

       BeginTransCommitTransRollbackTransADOConnection部件供數據庫應用程序在運行時調用開始事務、控制並保存或放棄所做數據修改的方法。

l  BeginTrans 開始一個事務

當開始一個事務時,後來所有讀寫數據庫的操作都發生在這次事務的環境中,直到本次事務通過調用CommitTransRollbackTrans來顯示的終止爲止。還以商品管理爲例,當購進或售出商品時,在商品數據庫記錄上必鬚髮生兩個修改:

       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的事務控制在VBDELPHI中的應用。

 


 

3     商品庫存管理中的數據庫

該數據庫GoodsManagementMicrosoftSQL 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 數據環境設計器


數據環境設計器中主要控件的屬性如下:

控件名        控件類型        重要屬性設置

CN                   ADOConnection對象    ConnectSource如下:

Provider=SQLOLEDB.1;Password=SA;Persist Security Info=True;User ID=sa;

Initial Catalog=GoodsManagement

     Goods                 ADOCommand對象   ConnectionNameCN 

                                                                                CommandTextGoods          

       InOutGoods            ADOCommand對象      ConnectionNameCN  

                                                                                CommandTextGoods          

      StrSQL                ADOCommand對象      ConnectionNameCN 

                                                                                CommandTextGoods          

 

   4進庫管理模塊的代碼 

下面就以其中的一個程序段“進庫管理”來說明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中的實現

51 系統中的數據模塊 


                           
2 數據模塊窗體


數據模塊窗體主要控件的屬性如下:

控件名        控件類型        重要屬性設置

ADOCn       ADOConnection對象   ConnectSource (同前)

         ADODatasetGoods     數據集部件ADODataset   ConnectionNameADOCN  

                                                                                          CommandTextGoods            

           ADODatasetInOutGoods  數據集部件ADODataset   ConnectionNameADOCN  

                                                                                          CommandTextGoods            

             ADODataset1          數據集部件ADODataset    ConnectionNameADOCN  

                                                                                          CommandTextGoods            

DataSourceGoods       DataSource控件       DatasetADODatasetGoods

DataSourceInOutGoods  DataSource控件        DatasetADODatasetInOutGoods

 

5進庫管理模塊的代碼

          下面就以其中的一個程序段“進庫管理”來說明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 controlVBDELPHI

 

 

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章