2017-08-26 2 views
-1

erstellen Ich verwende Oracle-Transaktion, um in Multi-Tabellen eine Master-Tabelle und zwei Details Tabellen zur gleichen Zeit einfügen. Also werde ich einen Datensatz in die Master-Tabelle und Multi-Datensätze in die anderen beiden Tabellen einfügen. Ich muss den Wert 1 zurückgeben, wenn der Operationserfolg in allen Tabellen, wenn ein Fehler auftritt, ich 0 und 3 zurückgeben werde, wenn die Daten bereits in der Master-Tabelle vorhanden sind. Ich brauche dies in C# zu tun, hier ist mein Code, und wie ich meinen Code auf andere Tabellen einfügen ändern können SchleifenOrakel-Transaktion mit C#

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

Sie werden sicherlich müssen Oracle Transaction instanziiert werden; Sie sollten auch einen using-Block verwenden, um sicherzustellen, dass er vollständig ist. Rufen Sie 'Commit' auf, um einen Rollback zu vermeiden. – Richard

Antwort

0

Sie haben mit fast implementieren:

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

danke, aber es gibt mir den folgenden Fehler "Objektverweis nicht auf eine Instanz eines Objekts festgelegt". beim Versuch, die Transaktion zu definieren ** OracleTransaction transaction = connection.BeginTransaction (IsolationLevel.ReadCommitted) ** –