2017-08-26 13 views
-1

oracleトランザクションを使用して、マルチテーブルに1つのマスター表と2つの詳細表を同時に挿入します。私はマスターテーブルに1つのレコードを挿入し、他の2つのテーブルには複数のレコードを挿入します。 エラーが発生した場合、すべてのテーブルで操作が成功すると値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 transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)** –

関連する問題