Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C创建oracle事务#_C#_Oracle_C# 4.0_Transactions - Fatal编程技术网

C# 使用C创建oracle事务#

C# 使用C创建oracle事务#,c#,oracle,c#-4.0,transactions,C#,Oracle,C# 4.0,Transactions,我使用oracle事务将一个主表和两个明细表同时插入到多个表中。因此,我将向主表插入一条记录,并向其他两个表插入多条记录。 如果所有表中的操作成功,我需要返回值1;如果发生错误,我将返回0;如果主表中已经存在数据,我将返回3。我需要用c#来做这件事,这是我的代码, 以及如何修改代码以使用循环插入其他表 public int RunOracleTransaction(Student s, Marks[] m, Course []s) { using (OracleConnection connec

我使用oracle事务将一个主表和两个明细表同时插入到多个表中。因此,我将向主表插入一条记录,并向其他两个表插入多条记录。 如果所有表中的操作成功,我需要返回值1;如果发生错误,我将返回0;如果主表中已经存在数据,我将返回3。我需要用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.");
    }
}
}

您几乎已经实现了它:

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  
}
public int RunOracleTransaction(学生s,分数[]m,课程[]c){
//TODO:验证s、m、c
使用(OracleConnection连接=新的OracleConnection(connectionString)){
connection.Open();
使用(OracleCommand=connection.CreateCommand()){
使用(OracleTransaction=connection.BeginTransaction(IsolationLevel.ReadCommitted)){
command.Transaction=事务;
试一试{
//插入学生
//TODO:将实际查询放在此处
command.CommandText=
@“插入学生(姓名)
值(:prm_名称)

将id返回到:prm_id”;//您肯定需要实例化
OracleTransaction
;您还应该使用using块来确保它完成。调用
Commit
以避免回滚。谢谢,但它会给我以下错误“对象引用未设置为对象实例”。尝试定义事务时OracleTransaction=connection.BeginTransaction(IsolationLevel.ReadCommitted)