ODBC 드라이버

CUBRID ODBC 드라이버는 ODBC 3.52 버전을 지원하며, ODBC 코어 부분과 Level 1과 Level 2 일부 API를 지원한다. CUBRID ODBC 드라이버는 ODBC Spec 3.x를 기반으로 구현되었으므로 ODBC Spec 2.x을 이용하여 작성한 프로그램에 대해서 하위 호환성을 완벽하게 보장하지는 않는다. 32비트만 지원하므로, Windows 64비트 환경이라도 CUBRID 32비트 버전을 설치해야 한다. Windows 64비트 환경에서 CUBRID 32비트의 ODBC 드라이버는 C:\Windows\SysWOW64\odbcad32.exe 를 실행하여 확인할 수 있다.

CUBRID ODBC 드라이버는 CCI API를 기반으로 작성되었으므로, CCI API 및 CCI에 적용되는 CCI_DEFAULT_AUTOCOMMIT 과 같은 설정 파라미터에 영향을 받는다.

별도로 ODBC 드라이버를 다운로드하거나 ODBC 드라이버에 대한 최신 정보를 확인하려면 http://www.cubrid.org/wiki_apis/entry/cubrid-odbc-driver에 접속한다.

CUBRID와 ODBC의 데이터 타입 매핑

다음은 CUBRID가 지원하는 데이터 타입과 ODBC 데이터 타입을 매핑한 표이다.

CUBRID 데이터 타입 ODBC 데이터 타입
CHAR SQL_CHAR
VARCHAR SQL_VARCHAR
STRING SQL_LONGVARCHAR
BIT SQL_BINARY
VARYING BIT SQL_VARBINARY
NUMERIC SQL_NUMERIC
INT SQL_INTEGER
SHORT SQL_SMALLINT
FLOAT SQL_FLOAT
DOUBLE SQL_DOUBLE
BIGINT SQL_BIGINT
DATE SQL_TYPE_DATE
TIME SQL_TYPE_TIME
TIMESTAMP SQL_TYPE_TIMESTAMP
DATETIME SQL_TYPE_TIMESTAMP
MONETARY SQL_DOUBLE
OID SQL_CHAR(32)
SET, MULTISET, SEQUENCE SQL_VARCHAR(MAX_STRING_LENGTH)

ODBC와 ASP 설치 및 설정

기본 환경

  • CUBRID 2008 R3.1(8.3.1) 이상, 32비트 버전

ODBC 드라이버 설정

CUBRID ODBC Driver는 CUBRID 설치 시 자동으로 설치되며, [제어판] > [관리 도구] > [데이터 원본(ODBC)]을 실행하면 [드라이버] 탭에서 확인할 수 있다.

../_images/image77.gif

DNS 설정

CUBRID ODBC Driver가 확인되었다면 응용 프로그램에서 접속하려는 데이터베이스로 DSN을 설정한다. DSN 설정을 위해 ODBC 데이터 원본 관리자에서 [추가] 버튼을 클릭하면 다음과 같은 대화 상자가 나타난다. CUBRID Driver 를 선택하고 [마침] 버튼을 클릭한다.

../_images/image78.gif

[Config CUBRID Data Sources] 대화 상자가 나타나면 다음과 같은 내용을 입력한다.

../_images/image79.png
  • DSN : 데이터 원본의 이름을 설정한다.

  • DB Name : 접속할 데이터베이스 이름을 입력한다.

  • DB User : 데이터베이스 사용자 이름을 입력한다.

  • Password : 데이터베이스 사용자 비밀번호를 입력한다.

  • Server Address : 데이터베이스의 호스트 주소를 입력한다. localhost 또는 다른 서버의 IP 주소를 입력한다.

  • Server Port : CUBRID 브로커의 포트 번호를 입력한다. 기본값은 33000이다. CUBRID 브로커 포트 번호를 확인하려면 cubrid_broker.conf 파일에서 BROKER_PORT 값을 확인하거나, 터미널에서 cubrid service status 명령을 입력한다. 터미널에서 입력했을 때 화면은 다음과 같다.

    ../_images/image80.png
  • FETCH_SIZE : ODBC 드라이버가 내부적으로 사용하는 CCI 라이브러리의 cci_fetch() 함수를 호출할 때마다 서버로부터 fetch하는 레코드의 개수를 설정한다.

위와 같이 입력한 후 [확인]을 클릭하면 다음과 같이 [User Data Sources]에 데이터 원본이 추가된 것을 확인할 수 있다.

../_images/image81.png

DSN을 사용하지 않고 데이터베이스에 직접 연결

연결 문자열을 사용하여 CUBRID 데이터베이스에 직접 연결할 수도 있다. 연결 문자열의 예는 다음과 같다.

conn = "driver={CUBRID Driver};server=localhost;port=33000;uid=dba;pwd=;db_name=demodb;"

Note

CUBRID 데이터베이스에 연결하기 전에 데이터베이스를 먼저 시작하지 않으면 ODBC 오류가 발생한다. 데이터베이스(demodb)를 시작하려면 터미널에 cubrid server start demodb 명령을 입력한다.

ODBC 프로그래밍

연결 문자열(connection string) 구성

CUBRID ODBC 프로그래밍을 할 때 연결 문자열(connection string)은 다음과 같이 작성한다.

항목 설명
Driver CUBRID Driver 드라이버 이름
UID PUBLIC 사용자 아이디
PWD xxx 비밀번호
FETCH_SIZE 100 Fetch 크기
PORT 33000 브로커 포트 번호
SERVER 127.0.0.1 CUBRID 브로커 서버 IP 주소 또는 호스트 이름
DB_NAME demodb 데이터베이스 이름
DESCRIPTION cubrid_test 설명
CHARSET utf-8 문자셋

위의 예를 이용한 연결 문자열은 다음과 같다.

"DRIVER=CUBRID Driver;UID=PUBLIC;PWD=xxx;FETCH_SIZE=100;PORT=33000;SERVER=127.0.0.1;DB_NAME=demodb;DESCRIPTION=cubrid_test;CHARSET=utf-8"

Note

  • 연결 문자열에서 세미콜론(;)은 구분자로 사용되므로, 연결 문자열에 암호(PWD)를 지정할 때 암호의 일부에 세미콜론을 사용할 수 없다.
  • 스레드 기반 프로그램에서 데이터베이스 연결은 각 스레드마다 독립적으로 사용해야 한다.
  • 자동 커밋 모드에서 SELECT 문 수행 이후 모든 결과 셋이 fetch되지 않으면 커밋이 되지 않는다. 따라서, 자동 커밋 모드라 하더라도 프로그램 내에서 결과 셋에 대한 fetch 도중 어떠한 오류가 발생한다면 반드시 커밋 또는 롤백을 수행하여 트랜잭션을 종료 처리하도록 한다.

OID와 컬렉션 사용

ODBC는 관계형 DBMS에 맞게 설계되었다. 그러므로 CUBRID ODBC 드라이버는 CUBRID의 OID와 컬렉션과 같은 일부 객체지향 특징을 지원하지 않는다. CUBRID는 관계형 데이터 모델과 객체지향 데이터 모델을 통합한 객체관계형 DBMS이기 때문이다.

OID 사용

CUBRID ODBC 드라이버는 OID를 string (char(32))으로 간주하므로 OID를 포함하는 INSERT, UPDATE, DELETE 를 아래와 같이 사용할 수 있다. OID string을 사용할 때는 반드시 작은 따옴표 ('')처리가 필요하다. 다음 예제의 member 속성의 도메인은 객체(OID)와 같다.

insert into foo(member) values('@12|34|56')
delete from foo where member = '@12|34|56'
update foo set age = age + 1 where member = '@12|34|56'

컬렉션 사용

컬렉션 타입 : SET, MULTISET, SEQUENCE 세가지가 있다. CUBRID ODBC 드라이버는 컬렉션을 string(longvarchar)으로 간주한다. 컬렉션은 SELECT 질의에서 "{value_1, value_2, ... value_n}"와 같이 중괄호 안의 쉼표를 이용해 각 요소를 구분하여 획득한다.

Note

칼럼에서 정의한 크기보다 큰 문자열을 INSERT / UPDATE 하면 문자열이 잘려서 입력된다.

ASP 예제 프로그램

ASP 예제를 실행할 가상 디렉터리의 '기본 웹 사이트' 항목에서 마우스 오른쪽 버튼을 클릭한 뒤 [속성]을 클릭한다.

../_images/image82.png

위의 그림에서 웹사이트 확인 아래 IP 주소(모두 할당되지 않음) 으로 선택하면 localhost로 인식한다. 특정한 IP 주소를 통해 예제를 확인하려면 해당 IP에 해당 디렉터리를 가상 디렉터리로 인식시키고 등록 정보에 IP 주소를 등록한다.

아래의 예제 코드를 cubrid.asp로 만들고 가상 디렉터리에 저장한다.

<HTML>
    <HEAD>
     <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
       <title>CUBRID Query Test Page</title>
  </HEAD>

 <BODY topmargin="0" leftmargin="0">

 <table border="0" width="748" cellspacing="0" cellpadding="0">
   <tr>
     <td width="200"></td>
     <td width="287">
       <p align="center"><font size="3" face="Times New Roman"><b><font color="#FF0000">CUBRID</font>Query Test</b></font></td>
     <td width="200"></td>
   </tr>
 </table>

 <form action="cubrid.asp" method="post" >
 <table border="1" width="700" cellspacing="0" cellpadding="0" height="45">
   <tr>
     <td width="113" valign="bottom" height="16" bgcolor="#DBD7BD" bordercolorlight="#FFFFCC"><font size="2">SERVER IP</font></td>
     <td width="78"  valign="bottom" height="16" bgcolor="#DBD7BD" bordercolorlight="#FFFFCC"><font size="2">Broker PORT</font></td>
     <td width="148" valign="bottom" height="16" bgcolor="#DBD7BD" bordercolorlight="#FFFFCC"><font size="2">DB NAME</font></td>
     <td width="113" valign="bottom" height="16" bgcolor="#DBD7BD" bordercolorlight="#FFFFCC"><font size="2">DB USER</font></td>
     <td width="113" valign="bottom" height="16" bgcolor="#DBD7BD" bordercolorlight="#FFFFCC"><font size="2">DB PASS</font></td>
     <td width="80" height="37" rowspan="4" bordercolorlight="#FFFFCC" bgcolor="#F5F5ED">
       <p><input type="submit" value="실행하기" name="B1" tabindex="7"></p></td>
   </tr>
   <tr>
     <td width="113" height="1" bordercolorlight="#FFFFCC" bgcolor="#F5F5ED"><font size="2"><input type="text" name="server_ip" size="20" tabindex="1" maxlength="15" value="<%=Request("server_ip")%>"></font></td>
     <td width="78"  height="1" bordercolorlight="#FFFFCC" bgcolor="#F5F5ED"><font size="2"><input type="text" name="cas_port" size="15" tabindex="2" maxlength="6" value="<%=Request("cas_port")%>"></font></td>
     <td width="148" height="1" bordercolorlight="#FFFFCC" bgcolor="#F5F5ED"><font size="2"><input type="text" name="db_name" size="20" tabindex="3" maxlength="20" value="<%=Request("db_name")%>"></font></td>
     <td width="113" height="1" bordercolorlight="#FFFFCC" bgcolor="#F5F5ED"><font size="2"><input type="text" name="db_user" size="15" tabindex="4" value="<%=Request("db_user")%>"></font></td>
     <td width="113" height="1" bordercolorlight="#FFFFCC" bgcolor="#F5F5ED"><font size="2"><input type="password" name="db_pass" size="15" tabindex="5" value="<%=Request("db_pass")%>"></font></td>
   </tr>
   <tr>
     <td width="573" colspan="5" valign="bottom" height="18" bordercolorlight="#FFFFCC" bgcolor="#DBD7BD"><font size="2">QUERY</font></td>
   </tr>
   <tr>
     <td width="573" colspan="5" height="25" bordercolorlight="#FFFFCC" bgcolor="#F5F5ED"><textarea rows="3" name="query" cols="92" tabindex="6"><%=Request("query")%></textarea></td>
   </tr>
 </table>
 </form>
 <hr>

</BODY>
</HTML>

<%
    ' DSN과 SQL문을 가져온다.
    strIP = Request( "server_ip" )
    strPort = Request( "cas_port" )
    strUser = Request( "db_user" )
    strPass = Request( "db_pass" )
    strName = Request( "db_name" )
    strQuery = Request( "query" )

if strIP = "" then
   Response.Write "SERVER_IP를 입력하세요"
        Response.End ' IP가 없으면 페이지 종료
    end if
    if strPort = "" then
       Response.Write "Port 번호를 입력하세요"
        Response.End ' Port가 없으면 페이지 종료
    end if
    if strUser = "" then
       Response.Write "DB_USER를 입력하세요"
        Response.End ' DB_User가 없으면 페이지 종료
    end if
    if strName = "" then
       Response.Write "DB_NAME을 입력하세요"
        Response.End ' DB_NAME이 없으면 페이지 종료
    end if
    if strQuery = "" then
       Response.Write "확인하고자 하는 Query를 입력하세요"
        Response.End ' Query가 없으면 페이지 종료
    end if
 ' 연결 객체 생성
  strDsn = "driver={CUBRID Driver};server=" & strIP & ";port=" & strPort & ";uid=" & strUser & ";pwd=" & strPass & ";db_name=" & strName & ";"
' DB연결
Set DBConn = Server.CreateObject("ADODB.Connection")
       DBConn.Open strDsn
    ' SQL 실행
    Set rs = DBConn.Execute( strQuery )
    ' SQL문에 따라 메시지 보이기
    if InStr(Ucase(strQuery),"INSERT")>0 then
        Response.Write "레코드가 추가되었습니다."
        Response.End
    end if

    if InStr(Ucase(strQuery),"DELETE")>0  then
        Response.Write "레코드가 삭제되었습니다."
        Response.End
    end if

    if InStr(Ucase(strQuery),"UPDATE")>0  then
        Response.Write "레코드가 수정되었습니다."
        Response.End
    end if
%>
<table>
<%
    ' 필드 이름 보여주기
    Response.Write "<tr bgColor=#f3f3f3>"
    For index =0 to ( rs.fields.count-1 )
        Response.Write "<td><b>" & rs.fields(index).name & "</b></td>"
    Next
    Response.Write "</tr>"
    ' 필드 값 보여주기
    Do While Not rs.EOF
        Response.Write "<tr bgColor=#f3f3f3>"
        For index =0 to ( rs.fields.count-1 )
            Response.Write "<td>" & rs(index) & "</td>"
        Next
        Response.Write "</tr>"

        rs.MoveNext
    Loop
%>
<%
    set  rs = nothing
%>
</table>

http://localhost/ASP수행폴더/cubrid.asp에 접속하면 수행 결과를 확인할 수 있다. 위의 ASP 예제 코드를 실행하면 다음과 같은 결과를 출력한다. 해당 항목에 알맞은 값을 넣고 Query 항목에 질의문을 입력하고 [실행하기]를 클릭하면 하단에 질의 문의 결과가 출력된다.

../_images/image83.png

ODBC API

ODBC API에 대한 자세한 내용은 ODBC API Reference 문서( http://msdn.microsoft.com/en-us/library/windows/desktop/ms714562%28v=vs.85%29.aspx )를 참고한다. CUBRID ODBC에서 지원하는 함수 목록, ODBC Spec 버전 및 호환성은 다음과 같다.

API Version Introduced Standards Compliance Support
SQLAllocHandle 3.0 ISO 92 YES
SQLBindCol 1.0 ISO 92 YES
SQLBindParameter 2.0 ODBC YES
SQLBrowseConnect 1.0 ODBC NO
SQLBulkOperations 3.0 ODBC YES
SQLCancel 1.0 ISO 92 YES
SQLCloseCursor 3.0 ISO 92 YES
SQLColAttribute 3.0 ISO 92 YES
SQLColumnPrivileges 1.0 ODBC NO
SQLColumns 1.0 X/Open YES
SQLConnect 1.0 ISO 92 YES
SQLCopyDesc 3.0 ISO 92 YES
SQLDescribeCol 1.0 ISO 92 YES
SQLDescribeParam 1.0 ODBC NO
SQLDisconnect 1.0 ISO 92 YES
SQLDriverConnect 1.0 ODBC YES
SQLEndTran 3.0 ISO 92 YES
SQLExecDirect 1.0 ISO 92 YES
SQLExecute 1.0 ISO 92 YES
SQLFetch 1.0 ISO 92 YES
SQLFetchScroll 3.0 ISO 92 YES
SQLForeignKeys 1.0 ODBC YES(2008 R3.1 이상)
SQLFreeHandle 3.0 ISO 92 YES
SQLFreeStmt 1.0 ISO 92 YES
SQLGetConnectAttr 3.0 ISO 92 YES
SQLGetCursorName 1.0 ISO 92 YES
SQLGetData 1.0 ISO 92 YES
SQLGetDescField 3.0 ISO 92 YES
SQLGetDescRec 3.0 ISO 92 YES
SQLGetDiagField 3.0 ISO 92 YES
SQLGetDiagRec 3.0 ISO 92 YES
SQLGetEnvAttr 3.0 ISO 92 YES
SQLGetFunctions 1.0 ISO 92 YES
SQLGetInfo 1.0 ISO 92 YES
SQLGetStmtAttr 3.0 ISO 92 YES
SQLGetTypeInfo 1.0 ISO 92 YES
SQLMoreResults 1.0 ODBC YES
SQLNativeSql 1.0 ODBC YES
SQLNumParams 1.0 ISO 92 YES
SQLNumResultCols 1.0 ISO 92 YES
SQLParamData 1.0 ISO 92 YES
SQLPrepare 1.0 ISO 92 YES
SQLPrimaryKeys 1.0 ODBC YES(2008 R3.1이상)
SQLProcedureColumns 1.0 ODBC YES(2008 R3.1이상)
SQLProcedures 1.0 ODBC YES(2008 R3.1이상)
SQLPutData 1.0 ISO 92 YES
SQLRowCount 1.0 ISO 92 YES
SQLSetConnectAttr 3.0 ISO 92 YES
SQLSetCursorName 1.0 ISO 92 YES
SQLSetDescField 3.0 ISO 92 YES
SQLSetDescRec 3.0 ISO 92 YES
SQLSetEnvAttr 3.0 ISO 92 NO
SQLSetPos 1.0 ODBC YES
SQLSetStmtAttr 3.0 ISO 92 YES
SQLSpecialColumns 1.0 X/Open YES
SQLStatistics 1.0 ISO 92 YES
SQLTablePrivileges 1.0 ODBC YES(2008 R3.1이상)
SQLTables 1.0 X/Open YES

ODBC 3.x에서 하위 호환성을 지원하지 않는 일부 함수에 대해서는 아래의 매핑 테이블을 참고하여 적합한 함수로 변환한다.

ODBC 2.x 함수 ODBC 3.x 함수
SQLAllocConnect SQLAllocHandle
SQLAllocEnv SQLAllocHandle
SQLAllocStmt SQLAllocHandle
SQLBindParam SQLBindParameter
SQLColAttributes SQLColAttribute
SQLError SQLGetDiagRec
SQLFreeConnect SQLFreeHandle
SQLFreeEnv SQLFreeHandle
SQLFreeStmt with SQL_DROP SQLFreeHandle
SQLGetConnectOption SQLGetConnectAttr
SQLGetStmtOption SQLGetStmtAttr
SQLParamOptions SQLSetStmtAttr
SQLSetConnectOption SQLSetConnectAttr
SQLSetParam SQLBindParameter
SQLSetScrollOption SQLSetStmtAttr
SQLSetStmtOption SQLSetStmtAttr
SQLTransact SQLEndTran