2017-08-26 53 views
-1

我正在使用oracle事務同時插入到多表一個主表和兩個細節表。所以我會插入一個記錄到主表和多記錄到另外兩個表。 我需要返回值1,如果所有表中的操作成功,如果發生錯誤,我將返回0,如果數據已經存在於主表中,則返回3。我需要做這在C#,這裏是我的代碼, 以及我如何修改我的代碼使用循環使用C#創建oracle事務#

public int RunOracleTransaction(Student s, Marks[] m, Course []s) 
{ 
using (OracleConnection connection = new OracleConnection(connectionString)) 
{ 
    connection.Open(); 

    OracleCommand command = connection.CreateCommand(); 
    OracleTransaction transaction; 

    // Start a local transaction 
    transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted); 
    // Assign transaction object for a pending local transaction 
    command.Transaction = transaction; 

    try 
    { 
     // what i shall do to insert 1 record to master data and multi records //to details data as one transaction ? 
    } 
    catch (Exception e) 
    { 
     transaction.Rollback(); 
     Console.WriteLine(e.ToString()); 
     Console.WriteLine("Neither record was written to database."); 
    } 
} 
} 
+0

你會當然需要實例化'OracleTransaction';你還應該使用一個使用塊來確保它完成。調用'Commit'以避免回滾。 – Richard

回答

0

插入到其他表你已經基本實現:

public int RunOracleTransaction(Student s, Marks[] m, Course[] c) { 
    //TODO: validate s, m, c 

    using (OracleConnection connection = new OracleConnection(connectionString)) { 
    connection.Open(); 

    using (OracleCommand command = connection.CreateCommand()) { 
     using (OracleTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)) { 
     command.Transaction = transaction; 

     try { 
      // Insert the student 
      //TODO: put actual query here 
      command.CommandText = 
      @"insert into Students(name) 
        values (:prm_Name) 
       returning id into :prm_id"; // <- we want inserted student's id 

      //TODO: check actual RDBMS types 
      command.Parameters.Add(":prm_Name", OracleType.VarChar).Value = s.Name; 
      command.Parameters.Add(":prm_Id", OracleType.VarChar).Direction = ParameterDirection.Output; 

      command.ExecuteNonQuery(); 

      string studentId = Convert.ToString(comm.Parameters[":prm_Id"].Value); 

      // Insert his/her marks 
      command.Parameters.Clear(); // <- forget all prior parameters 

      //TODO: put actual query here 
      command.CommandText = 
      @"insert into StudentsMarks(student_Id, mark) 
        values (:prm_Student_Id, :prm_Mark)"; 

      //TODO: check actual RDBMS types 
      command.Parameters.Add(":prm_Student_Id", OracleType.VarChar).Value = studentId; 
      command.Parameters.Add(":prm_Mark", OracleType.Int32); 

      // insert each mark (in a loop) 
      foreach (var mark in m) { 
      command.Parameters[":prm_Mark"].Value = m.Mark; 
      command.ExecuteNonQuery(); 
      } 

      // Finally, commit all the inserts 
      transaction.Commit(); 
     } 
     catch (DataException e) { 
      transaction.Rollback(); 

      Console.WriteLine(e.ToString()); 
      Console.WriteLine("Neither record was written to database."); 
     } 
     } 
    } 
    } 

    //TODO: your method returns integer value, please return it 
} 
+0

謝謝,但它給了我以下錯誤「對象引用未設置爲對象的實例」。當試圖定義事務** OracleTransaction事務=連接.BeginTransaction(IsolationLevel.ReadCommitted)** –