티스토리 뷰

728x90

앞선 포스팅(티베로 DBMS 설치기)에 이어서 C#에서 티베로 DBMS를 사용하기를 다루어 봅니다. 아직 티베로는 닷넷 Native ADO.Net 드라이버를 제공하지 않기 때문에 OLE DB 드라이버를 등록하여 사용해야 합니다.

티베로의 OLE DB 드라이버 등록은 티베로 설치 폴더 아래 "bin"(필자의 경우 D:\tibero5\bin)에 있는 tbprov5.dll 파일을 C:\Windows\System32에 복사하고 regsvr32로 레지스트리에 등록하면 됩니다.


tbprov5.dll 파일을 복사한 다음 콘솔창에서 C:\Windows\System32로 이동하여 "regsvr32 tbprov5.dll"을 수행하면 위의 그림과 같이 DLL이 시스템에 등록되면서 응용 프로그램에서 ADO.Net OLE DB 연결 방식으로 티베로 DB를 사용할 준비를 마치게 됩니다. 별도의 클라이언트 설치는 필요 없습니다.

본격적인 C# 코딩을 위해서 티베로 설치 폴더 아래 "bin" 폴더에 있는 Tibero.DbAccess.dll을 프로젝트 디렉토리로 복사하고 참조에 추가합니다. 


위의 그림은 Tibero.DbAccess.dll의 내용으로 다른 DBMS의 ADO.Net 드라이버의 경우 OracleConnection, FbConnection, MySQLConnection 처럼 앞에 붙는 접두어(Prefix)만 교체하면 되었지만 티베로의 경우에는 앞에 OleDb를 붙이고 끝에 Tbr을 붙이는 방식으로 사용합니다. 참조를 추가했으면 "using Tibero.DbAccess;"와 "using System.Data.OleDb;"를 추가합니다. SQL Server의 경우 SqlConnection과 같이 "Sql"을 앞에 붙인 ADO.Net 클래스를 사용하는데 SQL Server를 기준으로 했을때 티베로의 클래스 대응은 아래와 같습니다.

  • SqlConnection -> OleDbConnectionTbr
  • SqlCommand -> OleDbCommandTbr
  • SqlDbType -> OleDbTypeTbr
  • SqlException -> Exception
  • SqlDataReader -> OleDbDataReader


티베로 또한 SQL 표준을 준수하고 있으므로 SQL 사용에는 무리가 없지만, 초기 오라클 윈백을 목표한 제품이다 보니 문법의 상당수는 오라클 기준으로 작성하면 동작에 무리가 없습니다. 대표적인 예 몇가지를 나열하면 아래와 같습니다.

  • 테이블 존재 여부 확인하기
    SELECT COUNT(*) cnt FROM ALL_TABLES WHERE table_name = '테이블 이름';
    SQL Server나 MySQL에서 지원하는 information_schema 대신 오라클의 "ALL_TABLES" 시스템 테이블을 사용합니다.
  • 더미(Dummy) 테이블
    SELECT 1 FROM dual;
    SQL Server등에서는 "SELECT 1;"과 같은 질의문을 사용할 수 있으나 티베로는 오라클 처럼 dual과 같은 더비 테이블이라도 지정해야 합니다.
  • 이름을 지정하여 파라미터 사용하기
    INSERT INTO tags_string (tagname, dt, val) VALUES (:name, :dt, :val);
    티베로도 오라클과 같이 콜론(:)을 앞에 붙여 파라미터를 지정할 수 있습니다.
  • 일시 리터럴 사용하기
    SELECT * FROM TBLA WHERE dt >= TO_DATE( fromdt, 'YYYY-MM-DD HH24:MI:SS');
    오라클과 같이 일시 타입의 컬럼(DATE)에 대해서 문자열로 직접 비교하지 않고 TO_DATE 함수를 사용하여 일시 리터럴로 전환해서 사용해야 합니다.
  • 페이징
    SELECT * FROM (SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.dt DESC, t.tagname) rnum FROM alarm t) WHERE rnum BETWEEN 1 AND 30);
    오라클의 "ROW_NUMBER() OVER" 구문을 그대로 사용할 수 있습니다.


OleDbConnectionTbr conn = new OleDbConnectionTbr("Provider=tbprov.Tbprov.5; Location=127.0.0.1,8629; Data Source=tibero;User ID=sys;Password=tibero");
conn.Open();
//........
conn.Close();

위의 코드는 데이터베이스 연결 과정으로 연결스트링의 "Provider"는 등록한 OLE DB 드라이버의 버전과 일치해야 합니다. Tibero 5의 경우 "tbprov.Tbprov.5"를 입력합니다. 

cmd = new OleDbCommandTbr("SELECT COUNT(*) cnt FROM ALL_TABLES WHERE table_name = 'TAGS_STRING', conn);
if (Convert.ToInt32(cmd.ExecuteScalar()) <= 0)
{
    cmd.CommandText = "CREATE TABLE tags_string (tagname VARCHAR(16), dt DATE, val VARCHAR(255), " +
        "PRIMARY KEY(tagname, dt));";
    cmd.ExecuteNonQuery();
}

특정 테이블의 존재 여부를 확인하여 해당 테이블이 존재하지 않으면 테이블을 생성하는 예제 코드입니다. 테이블명을 대문자로 조회하는 것에 주의하셔야 합니다.

cmd = new OleDbCommandTbr("INSERT INTO tags_string (tagname, dt, val) VALUES (:name, :dt, :val)", conn);
cmd.Parameters.Add(":name", OleDbTypeTbr.VarChar, 16);
cmd.Parameters.Add(":dt", OleDbTypeTbr.DBTimeStamp);
cmd.Parameters.Add(":val", OleDbTypeTbr.VarChar, 255);
cmd.Prepare();
cmd.Parameters[0].Value = tagid;
cmd.Parameters[1].Value = dtNow;
cmd.Parameters[2].Value = strvalue;
cmd.ExecuteNonQuery();

Prepared statement와 이름 파라미터를 모두 사용하는 예제 코드로 대량의 데이터를 안전하면서도 고속으로 삽입할 수 있는 방법입니다.

OleDbCommandTbr rcmd = new OleDbCommandTbr("SELECT * FROM (SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.dt DESC, t.tagname) rnum FROM alarm t " +
    ") WHERE rnum BETWEEN 1 AND 30", cconn);

OleDbDataReader reader = rcmd.ExecuteReader();
if (reader.HasRows)
{
    DataTable rettbl = new DataTable();
    rettbl.Load(reader);
}
reader.Close();

끝으로 테이블에 페이징 기법을 동원해서 질의를 수행하는 예제로 주목할 부분은 DataReader의 경우 티베로의 클래스가 아니라 닷넷에서 제공하는 OleDbDataReader 클래스를 사용해야 한다는 점입니다.

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함