首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C#创建oracle事务

问使用C#创建oracle事务
EN

Stack Overflow用户
提问于 2017-08-26 17:10:39
回答 1查看 8.1K关注 0票数 0

我正在使用oracle事务将多表、多表、、、一个主表和两个详细表同时插入到中。所以我将把一条记录插入主表,多条记录插入到另外两张表。如果在所有表中操作成功,我需要返回值1,如果发生错误,我将返回0,如果主表中已经存在数据,则返回3。我需要在c#中这样做,下面是我的代码,以及如何修改代码以使用循环插入到其他表中

代码语言:javascript
复制
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.");
    }
}
}
EN

回答 1

Stack Overflow用户

发布于 2017-08-26 19:16:34

您几乎实现了它:

代码语言:javascript
复制
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  
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45897833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档