熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

在.NET中使用Oracle數據庫事務

2013-11-13 22:19:38  來源: Oracle 

  在本文中您將了解到如何在 Visual Basic NET (VBNET) 和 Visual C# NET (C#) 中使用數據庫事務具體來講您將系統學習數據庫事務NET 程序中使用 OracleTransaction 對象以及如何設置事務保存點本文中引用的所有腳本和文件都在這裡提供本文假定您大體上熟悉 C# 和 VBNET 編程

  所需軟件

  如果您要跟隨我們逐步完成本文中給出的示例那麼您需要安裝以下軟件

  Windows NT Windows Windows XP Professional 或 Windows Server

  能夠訪問一個已安裝的 Oracle 數據庫(Oraclei 版本 或更高版本)

  Oracle 客戶機(版本 或更高版本)

  Oracle Net(版本 或更高版本)

  Oracle Data Providers for NET(版本 或更高版本)

  Microsoft NET Framework(版本 或更高版本)

  Microsoft NET 框架 SDK(版本 或更高版本)

  如果您打算使用企業服務事務或分布式事務來開發和運行應用程序那麼您還需要安裝 Oracle Services for Microsoft Transaction Server( 或更高版本)

  您需要分別下載和安裝 NET 框架以及 SDK(先安裝框架)您還需要下載和安裝 Oracle 數據庫 g它包括 Oracle Data Provider for NET (ODPNET)您可以選擇在不同計算機或同一計算機上安裝 ODPNET 和數據庫服務器

  注意ODPNET 驅動程序針對 Oracle 數據庫訪問進行了優化因此可以獲得最佳性能並且它們還支持 Oracle 數據庫的豐富特性如 BFILEBLOBCLOBXMLType 等如果您正在開發基於 Oracle 數據庫的 NET 應用程序那麼就特性和性能來講ODPNET 無疑是最佳的選擇

  數據庫模式設置

  首先您需要設置數據庫模式在此我們使用一個簡化的 Web 商店示例您必須首先創建一個名為 store 的用戶並按以下方式將所需的權限授予該用戶(您必須首先以擁有 CREATE USER 權限的用戶身份登錄數據庫才能創建用戶)

  CREATE USER store IDENTIFIED BY store;
  GRANT connect resource TO store;

  注意您會在源代碼文件 dbsql 中找到前兩個語句和該部分中出現的設置 store 模式的其他語句

  接下的語句以 store 用戶身份進行連接

  CONNECT store/store;

  以下語句創建了所需的兩個數據庫表名稱分別為 product_types 和 products

  CREATE TABLE product_types (
  product_type_id INTEGER
  CONSTRAINT product_types_pk PRIMARY KEY
  name VARCHAR() NOT NULL
  );

  CREATE TABLE products (
  product_id INTEGER
  CONSTRAINT products_pk PRIMARY KEY
  product_type_id INTEGER
  CONSTRAINT products_fk_product_types
  REFERENCES product_types(product_type_id)
  name VARCHAR() NOT NULL
  description VARCHAR()
  price NUMBER( )
  );

  注意如果您在一個不同的模式中為 store 用戶創建了這些數據庫表那麼您將需要修改示例配置文件(您稍後將看到)中的模式名稱

  表 product_types 用於存儲示例在線商店可能庫存的產品類型的名稱表 products 包含了所銷售產品的詳細信息

  下面的 INSERT 語句為表 product_types 和 products 添加行

  INSERT INTO product_types (
  product_type_id name
  ) VALUES (
   Book
  );
  INSERT INTO product_types (
  product_type_id name
  ) VALUES (
   DVD
  );

  INSERT INTO products (
  product_id product_type_id name description price
  ) VALUES (
   Modern Science A description of modern science
  );
  INSERT INTO products (
  product_id product_type_id name description price
  ) VALUES (
   Chemistry Introduction to Chemistry
  );
  INSERT INTO products (
  product_id product_type_id name description price
  ) VALUES (
   Supernova A star explodes
  );
  INSERT INTO products (
  product_id product_type_id name description price
  ) VALUES (
   Tank War Action movie about a future war
  );

  COMMIT;

  接下來您將了解有關數據庫事務的內容

  數據庫事務簡介

  數據庫事務是由一組 SQL 語句組成的一個邏輯工作單元您可以把事務看作是一組不可分的 SQL 語句這些語句作為一個整體永久記錄在數據庫中或一並撤銷比如在銀行帳戶之間轉移資金一條 UPDATE 語句將從一個帳戶的資金總數中減去一部分另一條 UPDATE 語句將把資金加到另一個帳戶中減操作和加操作必須永久記錄在數據庫中或者必須一並撤銷 ― 否則將損失資金這個簡單的示例僅使用了兩條 UPDATE 語句但一個更實際的事務可能包含許多 INSERTUPDATE 和 DELETE 語句

  要永久記錄一個事務中的 SQL 語句的結果您可以通過 COMMIT 語句來執行提交要撤銷 SQL 語句的結果您可以使用 ROLLBACK 語句來執行回滾這會把所有的行重設為它們原來的狀態只要您事先沒有與數據庫斷開則您在執行回滾之前所做的任何修改都將被撤銷您還可以設置一個保存點以便將事務回滾至該特定的點同時保持事務中的其他語句原封不動

  在 C# 和 VBNET 中使用數據庫事務

  您可以使用 OracleTransaction 類的一個對象來表示一個事務OracleTransaction 類包含多個屬性其中的兩個為 Connection(指定與事務關聯的數據庫連接)和 IsolationLevel(指定事務隔離級別)本文稍後將向您介紹更多有關事務隔離級別的內容

  OracleTransaction 類包含許多操控事務的方法您可以使用 Commit() 方法永久提交 SQL 語句並可以使用 Rollback() 撤銷這些語句您還可以使用 Save() 在事務中設置一個保存點

  我現在將帶著您逐步完成兩個示例程序 ― 一個用 C# 編寫 (TransExamplecs)另一個用 VBNET 編寫 (TransExamplevb)這些程序演示了如何執行一個包含了兩條 INSERT 語句的事務第一條 INSERT 語句將在表 product_types 中添加一行第二條將在表 products 中添加一行

  導入命名空間

  以下 C# 程序語句指定在程序中使用 System 和 OracleDataAcessClient 命名空間

  using System;
  using OracleDataAccessClient;

  下面是等價的 VBNET 語句

  Imports System
  Imports OracleDataAccessClient

  OracleDataAccessClient 命名空間是 ODPNET 的一部分它包含許多類其中有 OracleConnectionOracleCommand 和 OracleTransaction示例程序用到了這些類

  第

  創建一個 OracleConnection 對象連接到 Oracle 數據庫然後打開該連接

  在 C# 中

  OracleConnection myOracleConnection =
  new OracleConnection(
  User Id=store;Password=store;Data Source=ORCL
    );
  myOracleConnectionOpen();
  在 VBNET 中

  Dim myOracleConnection As New OracleConnection( _
  User Id=store;Password=store;Data Source=ORCL)
  myOracleConnectionOpen()

  User Id 和 Password 屬性指定了您所要連接到的模式的數據庫用戶和口令Data Source 屬性指定了數據庫的 Oracle Net 服務名稱初始數據庫的默認服務名稱為 ORCL如果您使用的不是初始數據庫或者您的服務名稱不同那麼您需要在程序中修改 Data Source 屬性的設置

  第

  創建一個 OracleTransaction 對象然後調用 OracleConnection 對象的 BeginTransaction() 方法啟動事務

  在 C# 中

  OracleTransaction myOracleTransaction =
  myOracleConnectionBeginTransaction();
  In VBNET:

  Dim myOracleTransaction As OracleTransaction = _
  myOracleConnectionBeginTransaction()

  第

  創建一個 OracleCommand 對象用於存儲 SQL 語句

  在 C# 中

  OracleCommand myOracleCommand = myOracleConnectionCreateCommand();

  在 VBNET 中

  Dim myOracleCommand As OracleCommand =
  myOracleConnectionCreateCommand

  因為 OracleCommand 對象使用 OracleConnection 對象的 CreateCommand() 方法創建的所以它自動使用在第 步中為 OracleConnection 對象設置的事務

  第

  將 OracleCommand 對象的 CommandText 屬性設為向表 product_types 中添加一行的第一條 INSERT 語句

  在 C# 中

  myOracleCommandCommandText =
  INSERT INTO product_types ( +
    product_type_id name +
  ) VALUES ( +
    Magazine +
    );

  在 VBNET 中

  myOracleCommandCommandText = _
  INSERT INTO product_types ( & _
    product_type_id name & _
  ) VALUES ( & _
    Magazine & _
    )
 
  第

  使用 OracleCommand 對象的 ExecuteNonQuery() 方法運行 INSERT 語句

  在 C# 中

  myOracleCommandExecuteNonQuery();

  在 VBNET 中

  myOracleCommandExecuteNonQuery()

  第 和第

  將 OracleCommand 對象的 CommandText 屬性設為向表 Products 中添加一行的第二條 INSERT 語句並運行它

  在 C# 中

  myOracleCommandCommandText =
  INSERT INTO products ( +
    product_id product_type_id name description price +
  ) VALUES ( +
    Oracle Magazine Magazine about Oracle +
    );
  myOracleCommandExecuteNonQuery();

  在 VBNET 中

  myOracleCommandCommandText = _
  INSERT INTO products ( & _
    product_id product_type_id name description price & _
  ) VALUES ( & _
    Oracle Magazine Magazine about Oracle & _
    )
  myOracleCommandExecuteNonQuery()

  第

  使用 OracleTransaction 對象的 Commit() 方法提交數據庫中的事務

  在 C# 中

  myOracleTransactionCommit();

  在 VBNET 中

  myOracleTransactionCommit()

  在完成 Commit() 方法之後由 INSERT 語句添加的兩行將在數據庫中永久記錄

  第

  使用 Close() 方法關閉 OracleConnection 對象

  在 C# 中

  myOracleConnectionClose();

  在 VBNET 中

  myOracleConnectionClose()

  編譯並運行示例程序

  要編譯 C# 示例程序您可以使用 csc 命令運行 C# 編譯器因為程序使用 Oracle Data Access DLL所以您應使用 /r 選項指定該 DLL 的完整路徑例如

  csc TransExamplecs /r:C:\oracle\product\\
  Client_\bin\OracleDataAccessdll

  注意您需要用您計算機上的相應路徑來替換該 DLL 的路徑此外如果您的計算機找不到 csc 編譯器那麼您可能需要運行 Microsoft sdkvarsbat 腳本來首先設置 NET SDK 的環境變量您可以在安裝 NET SDK 的 bin 目錄中找到該腳本

  如果您遇到以下錯誤

  Examplecs():error CS:The type or namespace name Oracle
  could not be found (are you missing a using directive or an assembly reference?)

  這說明您沒有在編譯命令中正確指定 Oracle Data Access DLL(有關設置的信息請參閱 John Paul Cook 的技術文章在 Oracle 數據庫上構建 NET 應用程序

  下面是用於編譯 VBNET 程序的等價命令

  vbc TransExamplevb /r:C:\oracle\product\\
  Client_\bin\OracleDataAccessdll /r:systemdll /r:systemdatadll

  接下來輸入以下命令運行示例

  TransExample

  您將看到程序的輸出不過如果您遇到類似以下的異常

  An exception was thrown
  Message = ORA:TNS:listener does not currently know
  of service requested in connect descriptor

  這說明 OracleConnection 對象的連接字符串中的 Data Source 的設置不正確您應當咨詢您的 DBA 或查閱 Oracle Net 文檔以獲得更多詳細信息

  如果您使用的是 VS NET那麼您可以遵循以下指示來編譯和運行 C# 程序 TransExamplecs

  創建一個新的 C# 控制台應用程序File>New Project然後選擇 Visual C# ProjectsConsole Application

  將項目命名為 TransExample

  用 TransExamplecs 中的代碼替換 VS NET 生成的所有代碼

  選擇 Project>Add Reference 添加對 OracleDataAccessdll 的引用然後浏覽至您安裝 ODPNET 的目錄(在我的計算機上它是 C:\oracle\product\\Client_\bin\OracleDataAccessdll)然後雙擊 OracleDataAccessdll

  選擇 Debug>Start without Debugging 運行該程序

  要編譯和運行 TransExamplevb您可以執行類似的一系列步驟但第 步應選擇一個 Visual Basic 控制台應用程序並在第 步用 TransExamplevb 中的代碼替換生成的代碼

  查看程序的運行結果

  當您運行完 C# 或 VB NET 程序時您可以在 SQL*Plus 中使用以下 SELECT 語句查看事務的結果

  SELECT pproduct_id pproduct_type_id pt name pname pdescription pprice
  FROM products p product_types pt
  WHERE pproduct_type_id = ptproduct_type_id
  AND pproduct_id = ;

  您將看到以下結果

  PRODUCT_ID PRODUCT_TYPE_ID NAME       NAME
  
  DESCRIPTION                                             PRICE
  
                 Magazine   Oracle Magazine
  Magazine about Oracle                                   

  接下來您將了解如何設置事務保存點

  NET 程序中設置事務保存點

  正如本文前面所提到的那樣您可以設置一個保存點以便將事務回滾至該特定的點同時保持事務中的其他語句原封不動您可以使用 OracleTransaction 類的 Save() 方法在事務中設置保存點

  如果您有一個非常長的事務並且希望能夠僅回滾到某個特定的時間點那麼您可能要使用保存點例如您可能想對 個產品做一些更改然後設置一個保存點然後再對另 個產品做更改如果您在進行第二批更改時出現了錯誤那麼您可以回滾至保存點使您的第一批更改原封不動

  我將帶您逐步完成演示如何使用保存點的 C# (TransExamplecs) 示例程序和 VBNET (TransExamplevb) 示例程序中的相關新步驟這些程序向表 products 中添加一行設置一個保存點向表 products 中添加另一行回滾至保存點然後從表 products 中讀取這些行在回滾至保存點後只有添加到表 products 中的第一行保留了下來第二行將已被刪除

  第 到第 步與在 C# 和 VBNET 中使用數據庫事務部分中所示的步驟相同因此在這裡將其省略

  第

  向表 products 中添加一行該行的產品 ID 為

  在 C# 中

  myOracleCommandCommandText =
  INSERT INTO products ( +
    product_id product_type_id name description price +
  ) VALUES ( +
    Man from Another World Man from Venus lands on Earth +
    );
  myOracleCommandExecuteNonQuery();

  在 VBNET 中

  myOracleCommandCommandText = _
  INSERT INTO products ( & _
    product_id product_type_id name description price & _
    ) VALUES ( & _
    Man from Another World Man from Venus lands on Earth & _
    )
  myOracleCommandExecuteNonQuery()

  第

  使用 OracleTransaction 的 Save() 方法設置一個名為 SaveProduct 的保存點

  在 C# 中

  myOracleTransactionSave(SaveProduct);

  在 VBNET 中

  myOracleTransactionSave(SaveProduct)

  第

  向表 products 中添加另一行該行的產品 ID 為

  在 C# 中

  myOracleCommandCommandText =
  INSERT INTO products ( +
    product_id product_type_id name description price +
  ) VALUES ( +
    ZFiles Mysterious stories +
    );
  myOracleCommandExecuteNonQuery();

  在 VBNET 中

  myOracleCommandCommandText = _
  INSERT INTO products ( & _
    product_id product_type_id name description price & _
  ) VALUES ( & _
    ZFiles Mysterious stories & _
    )
  myOracleCommandExecuteNonQuery()

  第

  回滾到先前在第 步中設置的 SaveProduct 保存點

  在 C# 中

  myOracleTransactionRollback(SaveProduct);

  在 VBNET 中

  myOracleTransactionRollback(SaveProduct)

  完成回滾後在第 步中添加的第二行已被刪除而在第 步中添加的第一行保留了下來

  TransExamplecs 和 TransExamplevb 中剩下的步驟顯示表 products 的內容回滾整個事務並從數據庫斷開

  用於 Microsoft Transaction Server 的 Oracle 事務服務的快速說明

  Microsoft Transaction Server 是一個運行在互聯網或網絡服務器上的專有事務處理系統Microsoft Transaction Server 為客戶端計算機部署和管理應用程序和數據庫事務請求

  Microsoft Transaction Server 是以服務器為中心的三層體系結構模型的一個組件這種方法實現了將應用程序的表示業務邏輯和數據元素清晰地分布到在一個網絡中連接的不同計算機上無需專門集成您就可以在與 Oracle 數據庫服務器 版或更高版本連接的 Microsoft Transaction Server 中部署一個組件但首先您必須安裝 Oracle Services for Microsoft Transaction Server

  結論

  在本文中您系統學習了在 NET 程序中使用數據庫事務您了解了如何創建 OracleTransaction 對象並用它們將事務提交給數據庫如何使用保存點部分回滾一個事務以及 Oracle 數據庫如何分離並發事務


From:http://tw.wingwit.com/Article/program/Oracle/201311/18786.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.