2008-11-21 16 views
11

Tôi có chương trình biểu mẫu thắng C# .net chạy với cơ sở dữ liệu SQL Server. Tôi đang sử dụng LINQ to SQL. Có thể khôi phục lời gọi đến một hoặc nhiều thủ tục được lưu trữ bên trong một giao dịch trong chương trình của tôi bằng cách sử dụng LINQ-to-SQL không? Ban đầu tôi nghĩ sẽ có ý nghĩa để quản lý giao dịch bên trong thủ tục lưu sẵn nhưng nếu tôi cần khôi phục nhiều hơn một thủ tục lưu trữ như là một phần của một giao dịch, nó sẽ cần phải được thực hiện trong chương trình C# của tôi.Rollback một cuộc gọi thủ tục lưu trữ từ bên trong một giao dịch bằng cách sử dụng LINQ-to-SQL?

Ai đó có thể chỉ cho tôi một đoạn mã về cách thực hiện điều này hoặc cung cấp một số thông tin chi tiết về giải pháp thay thế?

Trả lời

-1

Mặc dù tôi không sử dụng procs lưu trữ, bạn coudl có một cái gì đó như thế:

public Response<SomeObject> SaveSomething(Object yourObject) 
    { 
     DbTransaction dbTransaction = null; 
     try 
     { 
      using (DataContext context = new DataContext()) 
      { 
        //Creates a new DB transaction 
        if (context.Connection.State == System.Data.ConnectionState.Closed) 
        { 
         context.Connection.Open(); 
        } 
        dbTransaction = context.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable); 
        context.Transaction = dbTransaction; 

     context.SaveYourObject(yourObject); 
        //Commit the transaction 
        dbTransaction.Commit(); 
        response.ResponseObject = yourObject; 
        response.Messages.AddSuccessfulSave("Saved!"); 
       } 
      } 
     } 
     catch (ChangeConflictException cex) 
     { 
      if (dbTransaction != null) dbTransaction.Rollback(); 
      response.Errors.AddConcurrencyError(); 
      response.IsSuccessful = false; 
     } 
     catch (SqlException sqlEx) 
     { 
      if (dbTransaction != null) dbTransaction.Rollback(); 
      if (sqlEx.Class == 14 && (sqlEx.Number == 2601 || sqlEx.Number == 2627)) //Duplicated key 
      { 
       response.Errors.Add(new Error 
       { 
        Name = "Duplicate item", 
        Description = "This object already exists." 
       }); 
       ExceptionPolicy.HandleException(sqlEx, SERVICE_EXCEPTION_POLICY); 
       response.IsSuccessful = false; 
      } 
      else //other SQL errors 
      { 
       response.Errors.AddSavingError("Your object", yourObjectId); 
       ExceptionPolicy.HandleException(sqlEx, SERVICE_EXCEPTION_POLICY); 
       response.IsSuccessful = false; 
      } 
     } 
15

Một thay thế cho DbTransactionTransactionScope - điều này cung cấp một mô hình lập trình đơn giản hơn nhiều, và có thể mở rộng với nhiều cơ sở dữ liệu đồng thời và các nguồn cấp dữ liệu khác (qua DTC) - nhưng với chi phí của một lượng nhỏ phí trên kết nối. Nó từng là overhead hơn, nhưng dưới SQL2005 vv nó sẽ sử dụng "LTM" cho đến khi bạn khởi động kéo dài nhiều kết nối - do đó, một hoạt động đơn lẻ thường là rất rẻ:

using (TransactionScope tran = new TransactionScope()) 
using (FooDataContext ctx = new FooDataContext()) 
{ 
    // your work with ctx 
    // ... 
    // other work involving connections etc 
    // ... 
    tran.Complete(); 
} 

Rất đơn giản ;-p Bạn cũng nên có thể làm cho giao dịch trở nên chi tiết hơn (chỉ qua một vài truy vấn) hoặc hơn bao gồm rất đơn giản. Hầu hết các mã hiện có sẽ tự động tranh thủ trong phạm vi giao dịch, làm cho nó rất dễ dàng để phù hợp với retro vào mã hiện có.

Để biết thêm thông tin về TransactionScope (và các giao dịch chung trong .NET), hãy xem here.

+2

chỉ muốn làm rõ một điểm nếu nó không rõ ràng: "Phương thức hoàn thành cam kết giao dịch. Nếu ngoại lệ đã bị ném, hoàn thành không được gọi và giao dịch được khôi phục". (từ liên kết đầu tiên ở trên) Vì vậy, không đi tìm 'rollback()' và không có bất kỳ đường dẫn mã nào thực hiện 'return' mà không hoàn thành() –

-2
private string RollBack_fn() 
{ 
    int sal = 0; 
    OracleConnection myconn = new OracleConnection(ConfigurationManager.AppSettings["con"].ToString()); 
    cmd = new OracleCommand("SP_student_MAST", myconn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    OracleParameter param1 = null, param2 = null, param3 = null, param4 = null, param5 = null; 

    try 
    { 
     myconn.Open(); 
     trans = myconn.BeginTransaction(); 
     cmd.Transaction = trans; 
     //param1 = new OracleParameter("pSNo", OracleType.VarChar, 5); 
     //param1.Value =""; 
     //cmd.Parameters.Add(param1); 

     param2 = new OracleParameter("pSName", OracleType.VarChar, 10); 
     // param2.Value = "Saravanan"; 
     param2.Value = TextBox1.Text; 
     cmd.Parameters.Add(param2); 

     param3 = new OracleParameter("pENo", OracleType.VarChar,5); 
     param3.Value = TextBox2.Text; 
     cmd.Parameters.Add(param3); 

     param4 = new OracleParameter("pEName", OracleType.VarChar,10); 
     // param4.Value = "Sangeetha"; 
     param4.Value = TextBox3.Text; 
     cmd.Parameters.Add(param4); 

     param5 = new OracleParameter("pSENo", OracleType.Char, 5); 
     param5.Value = ""; 
     cmd.Parameters.Add(param5); 
     sal = cmd.ExecuteNonQuery(); 
     trans.Commit(); 
     Response.Write("Record Saved"); 
     myconn.Close(); 
     // rollbackvalue = 0; 
    } 
    catch (Exception ex) 
    { 
     Response.Write("Not saved.RollBacked"); 
     trans.Rollback(); 
     //rollbackvalue = 1; 
    } 
    string cs = Convert.ToString(sal); 
    return cs; 

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