2012-12-19 35 views
9

Tôi có 2 bảng hỏi và chi tiết. Khi lưu nút bấm Tôi đã viếtQuay lại trong C#

fbsave(); 
fbsavedetails(); 

fbsave() lưu dữ liệu trong bảng điều tra và fbsavedetails() lưu dữ liệu trong bảng chi tiết.

ngay bây giờ nếu xảy ra lỗi trong fbsavedetails() thì cả hai bước sẽ được khôi phục.

là nó có thể?

+0

MS Access hoặc SQL Server? – andy

+2

làm thế nào để bạn làm lớp dữ liệu của bạn? lưu trữ-thủ tục? linq-to-sql? được kết nối? bị ngắt kết nối? –

+0

Bạn có thể thực hiện những gì bạn muốn bằng cách sử dụng các giao dịch, http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer

Trả lời

8

Bạn rõ ràng có thể tạo ra một giao dịch và thông qua đó xung quanh, ví dụ:

using(var connection = ...) 
{ 
    connection.Open(); 
    using (var tran = connection.BeginTransaction()) 
    { 
     try 
     { 
      FBSave(connection, tran); 
      FBSaveDetails(connection, tran); 
      tran.Commit(); 
     } 
     catch 
     { 
      tran.Rollback(); 
      throw; 
     } 
    } 
} 

Lưu ý rằng ở đây bạn phải cũng đặt Transaction trên mỗi lệnh, do vậy tại sao bạn cần phải vượt qua nó vào, và tất cả các lệnh phải nằm trên cùng một đối tượng kết nối.


Hoặc: bạn có thể sử dụng TransactionScope;

using(var tran = new TransactionScope()) 
{ 
    FBSave(); 
    FBSaveDetails(); 
    tran.Complete(); 
} 

hay:: điều quan trọng là Open() xảy ra bên các TransactionScope để có được nhập ngũ tự động là

using(var tran = new TransactionScope()) 
using(var connection = ...) 
{ 
    connection.Open(); 
    FBSave(connection); 
    FBSaveDetails(connection); 
    tran.Complete(); 
} 

với cách tiếp cận TransactionScope, bạn không cần phải thiết lập bất cứ điều gì đặc biệt - hầu hết nó là tự động. Dĩ nhiên, bạn có thể tùy ý chuyển kết nối vào các phương thức, nhưng chúng cũng có thể có được kết nối riêng của chúng, và trong hầu hết các trường hợp, nó sẽ hoạt động tốt.

+0

Liệu "mở bên trong TransactionScope để có được tự động enlistment" phủ nhận sự cần thiết cho DTC? –

+0

@MrMoose không, nhưng bạn * có thể * thường tránh nhu cầu DTC đơn giản bằng cách truyền kết nối xung quanh: nếu bạn chỉ sử dụng một đối tượng kết nối bên trong 'TransactionScope', nó sẽ được xử lý bởi LTM thay vì DTC (trong tất cả các phiên bản của SQL Server> = 2005, IIRC) –

7

Bạn có thể sử dụng TransactionScope.

using(var scope = new TransactionScope()) 
{ 
    //Complete the transaction only when both inserts succeed. 
    scope.Complete(); 
} 

nếu bạn không hoàn thành giao dịch, nó sẽ được khôi phục.

1

có hai cách để giải quyết vấn đề này

  1. sử dụng DbTransaction và vượt qua DbTransaction xung quanh hai phương pháp, cam kết giao dịch nếu thành công và rollback nếu lỗi xảy ra khuyết điểm: DbTransaction cần phải được thông qua xung quanh.
  2. sử dụng TransactionScope ưu: dễ dàng để sử dụng khuyết điểm: Access không được hỗ trợ, và nếu cơ sở dữ liệu là SQL2000, MSDTC phải được cấu hình
Các vấn đề liên quan