C# & ASP.NET

C#: 오라클 blob 에 이미지 삽입, 트랜젝션 처리 - 단일 이상건수. (ORA-01036: 잘못된 변수명/번호 해결)

조심이 2010. 12. 29. 15:36
반응형

우선 오라클에 여러건의 데이터를 삽입하는 방법을 알아보자.. (Blob 타입 포함)
여러건수 insert 를 위해 트랜젝션(Transaction) 처리를 하였다.

실행 도중 " ORA-01036: 잘못된 변수명/번호  " 에러가 발생하였는데 이것도 간단히 해결해 봤다.

//using System.Data.OracleClient  <- 사용안함

// Blob 데이터 처리를 위해 아래의 오라클 라이브러리를 참조.
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;


 private Oracle.DataAccess.Client.OracleConnection m_pConn;    //커넥션 개체
  private String m_sConStr = "Data Source=" + TNS 이름 + ";User ID=" + 사용자아이디+ ";Password=" + 패스워드;

 private Oracle.DataAccess.Client.OracleTransaction Transact;  //트랜젝션
 private Oracle.DataAccess.Client.OracleCommand Comm;   //커맨드 객체


 
 private void insertData()
{  
    //3건의 데이터가 있다고 가정한다. 
   // 이미지 파일이 들어가야 할 필드는 IMAGE 고 값은 :image 파라메터로 설정해 놓는다.

    string[] strQuery = new strQuery[3];
    strQuery[0] = "INSERT INTO AAAA( FILE_NAME, IMAGE) VALUES("이효리사진.jpg" , :image)";  
    strQuery[1] = "INSERT INTO AAAA( FILE_NAME, IMAGE) VALUES("이효리사진.jpg" , :image)";  
    strQuery[2] = "INSERT INTO AAAA( FILE_NAME, IMAGE) VALUES("이효리사진.jpg" , :image)";  
     
    m_pConn = new Oracle.DataAccess.Client.OracleConnection(m_sConStr);
    m_pConn.Open();
      
    if (m_pConn.State == ConnectionState.Open)
   {
          Comm = new OracleCommand();
          Comm.Connection = m_pConn;
          Transact = m_pConn.BeginTransaction();
         try{
          int cnt = 0;

                 foreach (string Query in strQuery)
                {
                        Comm.CommandText = Query;     


                          System.IO.FileStream fs = 
                                                 new System.IO.FileStream(업로드할파일경로+파일이름, FileMode.Open, FileAccess.Read);

                            byte[] b = new byte[fs.Length - 1];
                            fs.Read(b, 0, b.Length);
                            fs.Close();

   
                         Oracle.DataAccess.Client.OracleParameter oracleParameter = new                   
                                                                       Oracle.DataAccess.Client.OracleParameter();
                          

                            oracleParameter.ParameterName = ":image";
                            oracleParameter.OracleDbType = OracleDbType.Blob;
                            oracleParameter.Direction = ParameterDirection.Input;
                            oracleParameter.Size = b.Length;
                            oracleParameter.Value = b;
                            Comm.Parameters.Add(oracleParameter);

                            Comm.ExecuteNonQuery();

                            Comm.Parameters.Clear();  //중요
                           // 단일건은 문제가 안되지만 여러건일때 파라메터를 clear 안해주면
                          // " ORA-01036: 잘못된 변수명/번호  " 에러 발생.
                }
                         Transact.Commit();
            }catch{
                         Transact.Rollback();

             }
   }
}

반응형