CODEKILLER

반응형

OracleCommand 외부인자로 넘기기
OracleCommand 외부인자로 넘기기

일반적으로 사용되는 OracleCommand

아래의 예시는 일반적으로 구현되는 ExecuteNonQuery의 형식입니다. 보통의 경우에는 쿼리문 스트링과 추가 및 삭제할 Data 리스트를 넘겨서 하나의 함수에서 ExecuteNonQuery를 구동하도록 구현을 합니다. 그러나 여러 테이블에서의 추가/삭제/갱신이 발생할 경우에는 쿼리문과 넘기는 인자도 많아지게 되어 번거로운 함수가 됩니다. 

public int ExecuteNonQuery(string query, List<OracleParameter> paramLists)
{
    int rowsAffected = 0;

    OracleConnection connection = null;
    OracleCommand command = null;
    OracleTransaction transaction = null;

    try
    {
            connection = connection.Open();
            transaction = connection.BeginTransaction();

            // 인자로 받은 query 스트링을 OracleCommand로 처리
            command = new OracleCommand(query, connection);
            command.Transaction = transaction;   

            foreach (OracleParameter param in paramLists)
            {
                command.Parameters.Add(param);
            }

            command.ExecuteNonQuery();
            rowsAffected += command.ExecuteNonQuery();

        }

        command.Transaction.Commit();

    }
    catch (Exception ex)
    {
        if (transaction != null)
        {
            command.Transaction.Rollback();
        }

        throw ex;
    }
    finally
    {
        connection.Close();
    }

    return rowsAffected;
}

 

OracleCommand 인자로 넘기기

OracleConnection, OracleTransaction, OracleCommand를 외부에서 넘기도록 인자로 세팅을 합니다. 이때 OracleCommand를 ref로 설정을 해줘야 합니다. 다른 객체들은 한 번의 객체생성으로 인자로 넘기면서 사용이 가능하지만, OracleCommand는 각 함수마다 쿼리문이 들어가면서 객체가 생성이 되어야 해서 ref를 사용하지 않고 넘기면 쿼리 실행이 되지 않고 오류가 발생됩니다.

 

이런식으로 생성하시면 하나의 함수에서 수많은 Insert, Delete, Update문을 실행하기 위해 필요로 하는 모든 Data를 인자로 만들어서 넘겨서 처리해야 한다는 고민에서 조금 자유로울 수 있습니다.

 OracleConnection connection = connection.Open();
 OracleTransaction transaction = connection.BeginTransaction();
 OracleCommand command = null;
 try
 {
     // OracleConnection 인자로 넘기기
     // OracleTransaction 인자로 넘기기
     // OracleCommand 인자를 Ref 형식으로 넘기기
     // ExecuteNonQueryA..B..C..D는 각각의 테이블에서의 기능만 담당하는 함수.
     rowsAffected = ExecuteNonQueryA(queryA, ParamsA, ref command, connection, transaction);
     rowsAffected += ExecuteNonQueryB(queryB, ParamsB, ref command, connection, transaction);
     rowsAffected += ExecuteNonQueryC(queryB, ParamsC, ref command, connection, transaction);
     rowsAffected += ExecuteNonQueryD(queryB, ParamsD, ref command, connection, transaction);
     .... 하위로 또다른 Insert, Delete, Update문 등의 실행이 계속 추가 될 수 있음.
     
     command.Transaction.Commit();
 }
 catch (Exception ex)
 {
     if (transaction != null)
     {
         command.Transaction.Rollback();
     }

     throw ex;
 }
 finally
 {
     connection.Close();
 }
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band