locked
object reference error when define oracle transaction RRS feed

  • Question

  • User-1141190189 posted

    I am facing this error when define the oracle transaction "Object reference not set to an instance of an object". when trying to define the transaction OracleTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

    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  
    }



    Tuesday, September 5, 2017 12:18 PM

Answers

  • User2103319870 posted

    Sanfoor

    when trying to define the transaction OracleTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

    Most likely the connection object might not have been created or doesn't has an active connection. As a troubleshooting step you might consider wrapping your entire code inside try catch block and see if you are getting any exceptions.

    public int RunOracleTransaction(Student s, Marks[] m, Course[] c)
            {
                //TODO: validate s, m, c
                try
                {
                    using (OracleConnection connection = new OracleConnection(connectionString))
                    {
                        connection.Open();
    
                        using (OracleCommand command = connection.CreateCommand())
                        {
                            using (OracleTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted))
                            {
                                command.Transaction = transaction;
    
    
                                // 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  
            }

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Tuesday, September 5, 2017 2:21 PM

All replies

  • User2103319870 posted

    Sanfoor

    when trying to define the transaction OracleTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

    Most likely the connection object might not have been created or doesn't has an active connection. As a troubleshooting step you might consider wrapping your entire code inside try catch block and see if you are getting any exceptions.

    public int RunOracleTransaction(Student s, Marks[] m, Course[] c)
            {
                //TODO: validate s, m, c
                try
                {
                    using (OracleConnection connection = new OracleConnection(connectionString))
                    {
                        connection.Open();
    
                        using (OracleCommand command = connection.CreateCommand())
                        {
                            using (OracleTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted))
                            {
                                command.Transaction = transaction;
    
    
                                // 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  
            }

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Tuesday, September 5, 2017 2:21 PM
  • User269602965 posted

    Fix punctuation problems first

    1. There is no need for AT SYMBOL before insert command

    2. There is no need for COLON SYMBOL as part of the PARAMETER NAME, but keep colon in the INSERT STATEMENT so oracle knows it is a bind variable.

    Example of command and bind variables.

    I have also found it easier to enclose my SQL in an XML tag then I do not have to worry about escaping punctuation or managing CRLF messing with string formation.
    
    I do not have the TRANSACTION wrapper here.
    
    Imports System.Xml.Linq.XElement
    Try
      Dim SQL = <SQL>
                  UPDATE {YourSchemaName}.HELP_TICKET
                  SET TICKET_TIMESTAMP = :TICKET_TIMESTAMP
                  WHERE TICKET_SEQ = :TICKET_SEQ
                </SQL>
      Using conn As New OracleConnection(connectionString)
        Using cmd As New OracleCommand(SQL.Value, conn)
          cmd.Parameters.Clear()
          cmd.Parameters.Add("TICKET_TIMESTAMP", OracleDbType.Date, DateTimeStamp, ParameterDirection.Input)
          cmd.Parameters.Add("TICKET_SEQ", OracleDbType.Decimal, decTicketSeq, ParameterDirection.Input)
          conn.Open()
          cmd.ExecuteNonQuery()
        End Using
      End Using
    Catch ex As Exception
    End Try

    Wednesday, September 6, 2017 1:53 PM