티스토리 뷰



C#이나 VB.Net 환경으로 응용 프로그램을 개발하는 과정에 큐브리드 데이터베이스를 사용하기 위해서는 다른 DBMS 처럼 닷넷 네이티브로 제작된 ADO.NET 드라이버를 사용하는 것이 가장 좋습니다. 사용 방식이 DBMS 별로 메소드 이름만 약간 다를뿐 대부분 대동소이하기 때문에 응용 개발자 입장에서는 매우 편리한 방법입니다. 특히 닷넷 네이티브(full managed .Net code) 드라이버를 사용하면 클라이언트 배포 과정에서 별도의 프로그램을 설치할 필요도 없어지기 때문에 응용 프로그램의 배포 과정도 단순하게 하는 효과를 가져옵니다.


큐브리드의 ADO.NET 드라이버는 http://www.cubrid.org/?mid=downloads&item=ado_dot_net_driver에서 다운로드 받을 수 있습니다. 필자의 경우에는 ZIP 형태의 파일을 다운로드 받았습니다. 다운로드 받은 CUBRID ADO.NET Data Provider 9.3.0.0001.zip 파일을 압축해제 합니다.


다운로드 받은 파일을 압축 해제하면 위의 그림과 같은 파일들이 나오는데 *.chm 도움말을 열면 닷넷 응용에서 사용할 수 있는 여러 클래스에 대한 설명을 아래와 같이 자세하게 확인할 수 있습니다.


위의 그림을 보면 CUBRID.Data.CUBRIDClient 네임스페이스에 있는 클래스들은 공통적으로 "CUBRID"가 앞에 붙어 있는데 이는 다른 DBMS도 공통적으로 적용되는 것으로 DB 연결을 다루는 CUBRIDConnection의 경우 SQL Server는 SqlConnection, MySQL은 MySqlConnection, 오라클은 OracleConnection, 파이어버드는 FbConnection으로 클래스를 지원합니다. 앞에 붙는 이름만 바꾸고 스키마나 질의의 차이점만 보완하면 서로 다른 DBMS에 코드라도 거의 동일하게 동작한다는 의미인 것입니다. CUBRID.Data.dll 파일을 프로젝트 디렉토리로 복사하고 본격적인 개발을 시작합니다.


프로젝트 폴더로 옮겨 놓은 CUBRID.Data.dll 파일을 프로젝트의 참조 메뉴를 우측 마우스로 클릭하여 컨텍스트 메뉴>참조 추가로  선택합니다. 위의 그림은 참조 추가한 큐브리드 드라이버를 개체 브라우저로 조회한 결과입니다.


CUBRIDConnection conn = new CUBRIDConnection("server=localhost;database=testdb;port=33000;user=public;password=pubpub");
conn.Open();

// Table check
int chkmaster = 0;
using (CUBRIDCommand cmd = new CUBRIDCommand("SELECT COUNT(*) cnt FROM db_class WHERE class_name = 'tags_bool'", conn))
{
    CUBRIDDataReader tr = (CUBRIDDataReader)cmd.ExecuteReader();
    if (tr.HasRows && tr.Read())
    {
        chkmaster = (int)tr[0];
    }
}

if (chkmaster <= 0)
{   // table not exist -> create 
    CUBRIDCommand cmdexe = new CUBRIDCommand("CREATE TABLE alarm_master (tagname VARCHAR(16), dt DATETIME, almtype SMALLINT, almlevel SMALLINT, " +
        "stat SMALLINT, msg VARCHAR(255), PRIMARY KEY(tagname));", conn);
    cmdexe.ExecuteNonQuery();
}

//prepare statement
cmdinsmaster = new CUBRIDCommand("INSERT INTO alarm_master (tagname, dt, almtype, almlevel, stat, msg) " +
    "VALUES (?, ?, ?, ?, 0, ?)", conn);
cmdinsmaster.Parameters.Add("?p1", CUBRIDDataType.CCI_U_TYPE_STRING);
cmdinsmaster.Parameters.Add("?p2", CUBRIDDataType.CCI_U_TYPE_DATETIME);
cmdinsmaster.Parameters.Add("?p3", CUBRIDDataType.CCI_U_TYPE_SHORT);
cmdinsmaster.Parameters.Add("?p4", CUBRIDDataType.CCI_U_TYPE_SHORT);
cmdinsmaster.Parameters.Add("?p5", CUBRIDDataType.CCI_U_TYPE_STRING);
cmdinsmaster.Prepare();

//......

cmdinsmaster.Parameters[0].Value = tagid;
cmdinsmaster.Parameters[1].Value = dtNow;
cmdinsmaster.Parameters[2].Value = (Int16)alm_type;
cmdinsmaster.Parameters[3].Value = (Int16)alm_level;
cmdinsmaster.Parameters[4].Value = msg;
cmdinsmaster.ExecuteNonQuery();

//......
DataTable rettbl = new DataTable();

using (CUBRIDDataAdapter da = new CUBRIDDataAdapter("SELECT * FROM alarm_master " + list_condition +
    " ORDER BY dt DESC, tagname LIMIT " + staidx + "," + Page_row_count, conn))
{
    da.Fill(rettbl);
}
if (rettbl.Rows.Count <= 0) rettbl = null;

//......

위의 코드는 큐브리드 ADO.Net 드라이버를 사용하여 여러가지 데이터베이스 작업을 수행한 예제입니다. 정상적으로 수행되지만 다른 DBMS의 ADO.Net 드라이버의 사용 방식을 그대로 사용하면 정상 동작하지 않는 경우가 있기 때문에 드라이버의 권장 사용 방식을 중심으로 몇가지 주의할 점을 다룰까 합니다.

우선 CUBRIDConnection 오브젝트 생성 시점에 지정하는 연결 스트링입니다. 접속할 데이터베이스와 서버의 주소와 포트를 지정하는데 포트가 큐브리드 데이터베이스의 포트(1523)가 아니라 브로커(Broker)의 포트를 지정하는 점을 주의해야 합니다. 

[broker]
MASTER_SHM_ID           =30001
ADMIN_LOG_FILE          =log/broker/cubrid_broker.log

[%query_editor]
SERVICE                 =ON
BROKER_PORT             =30000
MIN_NUM_APPL_SERVER     =5
MAX_NUM_APPL_SERVER     =40
APPL_SERVER_SHM_ID      =30000
LOG_DIR                 =log/broker/sql_log
ERROR_LOG_DIR           =log/broker/error_log
SQL_LOG                 =ON
TIME_TO_KILL            =120
SESSION_TIMEOUT         =300
KEEP_CONNECTION         =AUTO
CCI_DEFAULT_AUTOCOMMIT  =ON

[%BROKER1]
SERVICE                 =ON
BROKER_PORT             =33000
MIN_NUM_APPL_SERVER     =5
MAX_NUM_APPL_SERVER     =40
APPL_SERVER_SHM_ID      =33000
LOG_DIR                 =log/broker/sql_log
ERROR_LOG_DIR           =log/broker/error_log
SQL_LOG                 =ON
TIME_TO_KILL            =120
SESSION_TIMEOUT         =300
KEEP_CONNECTION         =AUTO
CCI_DEFAULT_AUTOCOMMIT  =ON

위의 내용은 큐브리드 설치 폴더 아래 conf/cubrid_broker.conf의 내용으로 브로커 포트는 [%BROKER1]섹션의 BROKER_PORT를 통해서 지정합니다. 연결 스트링에서 주의할 또다른 점은 사용자 아이디와 비밀번호로 큐브리드 데이터베이스 사용을 위한 기본 환경에서 언급한대로 DBA, PUBLIC 사용자의 초기 비밀번호는 없지만 변경했다면 해당 비밀번호를 입력합니다.

실행 과정에서 ExecuteScalar()를 호출하면 실행은 되지만 드라이버 쪽에서 예외가 발생하는 현상이 있어서 예제 코드 처럼 using문으로 CUBRIDCommand 사용 단위를 묶어 CUBRIDDataReader 사용 후에 객체를 자동으로 해제하도록 하는 방법으로 ExecuteScalar() 기능을 대신했습니다. DataTable에 질의 결과를 로드시키는 경우도 비슷한 현상이 발생해서 using문으로 CUBRIDDataAdapter 사용 단위를 묶고 사용후 객체를 자동 해제하도록 했습니다. 큐브리드 ADO.Net이 계속 발전하고 있는 과정임을 감안해서 드라이버가 잘 동작하는 방법을 찾아서 사용하는 편이 좋을듯 합니다. 

큐브리드도 SQL 표준을 따르고 있으므로 대부분의 SQL이 다른 DBMS가 크게 다르지 않으며 특히 주목할 부분은 인터넷 발전 과정을 따라 MySQL 등에서 채용한 확장 문법을 큐브리드도 지원하고 있다는 것입니다. 대표적인 것이 예제에서 확인할 수 있는 LIMIT 구문으로 페이징을 보다 간단하게 구현할 수 있습니다.

끝으로 큐브리드 ADO.NET이 다른 DBMS와 차이가 크게 나는 부분으로 Prepared statement입니다. 값만 다르고 동일한 문법 구조를 가진 SQL에서 ?를 특정 컬럼 값을 대신하여 미리 파싱을 수행하고 추후에는 값만 설정하여 빠르게 수행하는 방법입니다. 성능 및 보안등의 필요에 따라 많이 사용하는 방식으로 다른 DBMS의 경우에는 여러 ?에 변수 이름을 붙일 수 있지만 큐브리드는 아직 위치에 기반하여 각 값을 지정할 수 있습니다. 또한 각 위치의 타입을 지정하는 Parameters.Add()에서 큐브리드는 브로커에서 정의하고 있는 CUBRIDDataType.CCI_U_TYPE_...방식의 타입으로 지정해야 합니다.

큐브리드의 지속적인 발전을 기대해 봅니다.


댓글
댓글쓰기 폼
«   2022/12   »
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
글 보관함