2010-01-16 51 views
14

我正在開發使用C#.NET和MS-訪問一個小的桌面應用程序。我沒有任何MS-Access的經驗。我想知道我們是否可以在Ms-Access中使用交易。我們在MS-Access中有交易嗎?

我下面提到的情況。

插入在TBL 1
插入在TBL2

我想在tbl2的插入,只有當插入TBL 1成功。如果在插入tbl2期間有一些異常,我想要在tbl1中回滾插入。
我知道這可以很容易地在SQL服務器來實現,但在MS-接入的情況下,我應該如何管理這個。 請幫助,在此先感謝。

+1

一些注意事項:http://stackoverflow.com/questions/1987696/rollback-multiple-sql-update-queries -in-MS-接入/ 1987718#1987718 – Fionnuala

+1

Access沒有交易,因爲Access不是一個數據庫引擎。 Jet/ACE(Access的默認數據庫引擎)支持提交/回滾,只要我使用它(自Jet 2.x以來,例如1996)。它從來不支持事務日誌記錄,並且可能永遠不會(我認識到這不是你問的問題,但是很多來自服務器數據庫背景的Jet/ACE對於「事務」這個術語的含義頗爲模糊,並且很難時間掌握Jet/ACE支持一個而不是其他)。 –

回答

9

它看起來像我們這樣做:MSDN - TRANSACTION Statement (Microsoft Access SQL)

交易不會自動啓動。要開始交易,你必須這樣做明確使用:

BEGIN TRANSACTION 

通過提交事務期間執行的所有工作成交:

COMMIT [TRANSACTION | WORK] 

通過回滾事務期間執行的所有工作成交:

ROLLBACK [TRANSACTION | WORK] 
+0

好吧,Access 2007支持它,但Access 2003呢? – leeand00

+4

開始事務,提交和回滾由噴氣發動機的支載,因此,如果您使用過的噴射流的.mdb文件(從ADO調用程序),它可以是ACCESS97以上。@ leeand00 –

1

是Microsoft Access支持事務,它們工作得很好。幾年前,我使用Access構建了一個商業POS應用程序作爲我的數據庫,並且事務支持工作得很好。

即使如此,如果可能的話,我會使用SQL Server Express。它是免費的,比Access更強大。

+0

我會使用sqlserver,但我的客戶端需要使用pendrive運行此應用程序。直接即插即用。他不想在他的電腦上安裝任何軟件。 –

+3

SQL Server Compact版本像Access一樣可嵌入,但仍像SQL Server一樣運行,但有些功能不可用。 – David

+0

okk,那對我的應用程序來說會很棒。你的意思是我不必在客戶端PC上安裝任何.net組件。 (除了.net框架) – 2010-01-16 18:45:11

13

在答案中甚至沒有人給你提供任何代碼示例,甚至還沒有引用示例(Access幫助文件包含示例)。要記住的關鍵問題是,在Jet/ACE(Access不支持事務本身 - 它取決於您正在使用的任何數據庫引擎)事務在工作空間級別進行控制。您可以爲您的交易創建一個新的工作區或創建一個新的工作區。下面是一些示例代碼:

On Error GoTo errHandler 
    Dim wrk As DAO.Workspace 
    Dim db As DAO.Database 
    Dim lngInvoiceID As Long 

    Set wrk = DBEngine.Workspaces(0) 
    Set db = wrk.OpenDatabase(CurrentDb.Name) 
    With wrk 
     .BeginTrans 
     db.Execute "INSERT INTO tblInvoice (CustomerID) VALUES (123);", dbFailOnError 
     lngInvoiceID = db.OpenRecordset("SELECT @@IDENTITY")(0) 
     db.Execute "INSERT INTO tblInvoiceDetail (InvoiceID) VALUES (" & lngInvoiceID & ")", dbFailOnError 
     .CommitTrans 
     Debug.Print "Inserted Invoice header and detail for Invoice " & lngInvoiceID 
    End With 

    exitRoutine: 
    If Not (db Is Nothing) Then 
     db.Close 
     Set db = Nothing 
    End If 
    Set wrk = Nothing 
    Exit Sub 

    errHandler: 
    MsgBox Err.Number & ": " & Err.Description, vbExclamation, "Error in transaction" 
    wrk.Rollback 
    Resume exitRoutine 

(代碼測試和Access內工作)獲取交易

+0

此工作的訪問版本是什麼? – leeand00

相關問題