2010-01-16 32 views
14

Tôi đang phát triển một ứng dụng dành cho máy tính để bàn nhỏ sử dụng C# .NET và MS-Access. Tôi không có bất kỳ kinh nghiệm nào trước đây về MS-Access. Tôi muốn biết liệu chúng ta có thể sử dụng các giao dịch trong Ms-Access hay không.Chúng tôi có giao dịch trong MS-Access không?

Tôi có tình huống được đề cập dưới đây.

Insert trong Tbl1
Insert trong Tbl2

Tôi muốn chèn vào tbl2 chỉ khi chèn trong tbl1 là thành công. Và nếu có một số ngoại lệ trong khi chèn vào tbl2, tôi muốn khôi phục việc chèn vào trong tbl1.
Tôi biết điều này có thể dễ dàng đạt được trong máy chủ sql, nhưng trong trường hợp truy cập ms, tôi nên quản lý điều này như thế nào. Xin vui lòng trợ giúp, cảm ơn trước.

+1

Một số lưu ý về giao dịch truy cập: http://stackoverflow.com/questions/1987696/rollback-multiple-sql-update-queries -in-ms-access/1987718 # 1987718 – Fionnuala

+1

Truy cập không có giao dịch, vì Access không phải là một cơ sở dữ liệu. Jet/ACE (công cụ db mặc định của Access) đã hỗ trợ commit/rollback miễn là tôi đã sử dụng nó (kể từ Jet 2.x, ví dụ: 1996). Nó không bao giờ hỗ trợ ghi nhật ký giao dịch và có lẽ sẽ không bao giờ (tôi nhận ra đó không phải là những gì bạn hỏi nhưng nhiều người đến với Jet/ACE từ nền cơ sở dữ liệu máy chủ thì khá mờ về ý nghĩa của thuật ngữ "giao dịch" và khó thời gian nắm bắt rằng Jet/ACE hỗ trợ một và không phải là khác). –

Trả lời

9

Có vẻ như chúng tôi làm: MSDN - TRANSACTION Statement (Microsoft Access SQL)

Giao dịch không được bắt đầu tự động. Để bắt đầu một giao dịch, bạn phải làm như vậy một cách rõ ràng cách sử dụng:

BEGIN TRANSACTION 

Kết luận một giao dịch bằng cách cam kết tất cả các công việc thực hiện trong thời gian giao dịch:

COMMIT [TRANSACTION | WORK] 

Kết luận một giao dịch bằng cách lăn lại tất cả công việc thực hiện trong giao dịch :

ROLLBACK [TRANSACTION | WORK] 
+0

OK để Access 2007 hỗ trợ nó, nhưng Access 2003 thì sao? – leeand00

+4

bắt đầu giao dịch, cam kết và rollback được hỗ trợ bởi động cơ phản lực, vì vậy nếu bạn sử dụng tệp .mdb thông qua máy bay phản lực (được gọi từ ADO trong chương trình), nó có thể là access97 hoặc cao hơ[email protected] leeand00 –

1

Có Microsoft Access hỗ trợ Giao dịch và chúng hoạt động khá tốt. Tôi đã xây dựng một ứng dụng POS thương mại bằng cách sử dụng Access làm cơ sở dữ liệu của tôi vài năm trước và hỗ trợ giao dịch hoạt động rất tốt.

Mặc dù vậy, nếu có thể, tôi sẽ sử dụng SQL Server Express. Nó hoàn toàn miễn phí và mạnh hơn Access.

+0

Tôi đã sử dụng sqlserver, nhưng khách hàng của tôi yêu cầu chạy ứng dụng này bằng cách sử dụng một pendrive. Cắm và chạy trực tiếp. Anh ta không muốn cài đặt bất kỳ phần mềm nào trên PC của mình. –

+3

Phiên bản SQL Server Compact có thể nhúng như Access, trong khi vẫn hoạt động như SQL Server, albet với một số tính năng không khả dụng. – David

+0

okk, điều đó thật tuyệt vời cho ứng dụng của tôi. Bạn có nghĩa là tôi không phải cài đặt bất kỳ thành phần nào của .net trên máy khách. (trừ khung .net) –

13

Không ai thực sự đưa cho bạn bất kỳ ví dụ mã nào ở đây trong câu trả lời hoặc thậm chí trích dẫn một ví dụ (mặc dù các tệp trợ giúp Access có bao gồm các ví dụ). Vấn đề quan trọng cần lưu ý là trong Jet/ACE (Access không hỗ trợ giao dịch - nó phụ thuộc vào bất kỳ cơ sở dữ liệu nào bạn đang sử dụng cho điều đó) rằng giao dịch được kiểm soát ở mức không gian làm việc. Bạn có thể tạo không gian làm việc mới cho giao dịch của mình hoặc tạo một không gian làm việc mới. Dưới đây là một số mẫu mã:

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 

(đang thử nghiệm và làm việc trong Access)

+0

Phiên bản truy cập nào hoạt động? – leeand00

Các vấn đề liên quan