ALTIBASE HDB Application Development ODBC User's Manual Release 6.3.1 (April 17, 2015)
----------------------------------------------------------- ALTIBASE Application Development ODBC User's Manual Release 6.3.1 Copyright c 2001~2014 ALTIBASE Corp. All Rights Reserved. 본문서의저작권은 알티베이스에있습니다. 이문서에대하여당사의동의없이무단으로복제또는전용할수없습니다. 알티베이스 152-790 서울시구로구구로동 182-13 대륭포스트타워 Ⅱ 10 층전화 : 02-2082-1114 팩스 : 02-2082-1099 고객서비스포털 : http://support.altibase.com homepage: http://www.altibase.com -----------------------------------------------------------
목차 서문... 5 이매뉴얼에대하여... 6 1. 개요... 9 소개... 10 데이터타입... 11 ODBC API... 12 2. 설치및설정... 15 설치... 16 설정... 18 3. ODBC 프로그래밍... 21 연결문자열 (Connection String)... 22 기본프로그래밍예제... 23 Visual C++ 예제... 27 Visual C# 예제... 28 Visual Basic 예제... 29 LOB 사용예제... 30 찾아보기... 33 목차 3
서문 서문 5
이매뉴얼에대하여 이매뉴얼은 Altibase C API 의사용법에대해설명한다. 대상사용자 이매뉴얼은다음과같은 ALTIBASE HDB 사용자를대상으로작성되었다. 데이터베이스관리자 성능관리자 데이터베이스사용자 응용프로그램개발자 기술지원부 다음과같은배경지식을가지고이매뉴얼을읽는것이좋다. 컴퓨터, 운영체제및운영체제유틸리티운용에필요한기본지식 관계형데이터베이스사용경험또는데이터베이스개념에대한이해 컴퓨터프로그래밍경험 데이터베이스서버관리, 운영체제관리또는네트워크관리경험 소프트웨어환경 이매뉴얼은데이터베이스서버로 ALTIBASE HDB 버전 6.3.1 을 사용한다는가정하에작성되었다. 이매뉴얼의구성 이매뉴얼은다음과같이구성되어있다. 제 1 장개요 제 2 장설치및설정 제 3 장 ODBC 프로그래밍 A. 부록 : FAQ 6 ODBC User's Manual
문서규칙 이절에서는이매뉴얼에서사용하는규칙에대해설명한다. 이 규칙을이해하면이매뉴얼과설명서세트의다른매뉴얼에서정보를 쉽게찾을수있다. 여기서설명하는규칙은다음과같다. 규칙 기울임꼴 고정폭글꼴 의미구문요소에서사용자가지정해야하는변수, 특수한값을제공해야만하는위치지정자, 강조, 또는책제목단락또는예제코드내에있는명령어 온라인매뉴얼 Altibase 고객서비스포털 (http://support.altibase.com) 에서국문및 영문매뉴얼 (PDF, HTML) 을받을수있다. Altibase 는여러분의의견을환영합니다. 이매뉴얼에대한여러분의의견을보내주시기바랍니다. 사용자의의견은다음버전의매뉴얼을작성하는데많은도움이됩니다. 보내실때에는아래내용과함께고객서비스포털 (http://support.altibase.com/kr/) 로보내주시기바랍니다. 사용중인매뉴얼의이름과버전 매뉴얼에대한의견 사용자의성함, 주소, 전화번호 이외에도 Altibase 기술지원설명서의오류와누락된부분및기타기술적인문제들에대해서이주소로보내주시면정성껏처리하겠습니다. 또한, 기술적인부분과관련하여즉각적인도움이필요한경우에도고객서비스포털을통해서비스를요청하시기바랍니다. 여러분의의견에항상감사드립니다. 서문 7
1. 개요 이장은 ALTIBASE HDB ODBC 드라이버를소개한다. 개요 9
소개 ODBC(Open Database Connectivity) 는마이크로소프트가만든, 데이터베이스에접근하기위한표준규격이다. ODBC API 를사용하여작성된 ODBC 애플리케이션이데이터베이스에접근하기위해서는 ODBC Driver Manager 같은 ODBC 소프트웨어외에, 접근하려는데이터베이스에서제공하는별도의모듈이나드라이버가필요하다. 이를위해 ALTIBASE HDB ODBC 드라이버가제공된다. ALTIBASE HDB ODBC 드라이버는 ODBC 3.51 스펙을준수한다. ALTIBASE HDB ODBC 드라이버는 ALTIBASE HDB CLI 기반으로작성되었으므로, ALTIBASE HDB ODBC 드라이버의내부동작이나세부적인지원사항은 ALTIBASE HDB CLI Manual 을참조해도무방하다. 10 ODBC User's Manual
데이터타입 ALTIBASE HDB 가지원하는 SQL 데이터타입과 ODBC 데이터 타입과의맵핑관계는 ALTIBASE HDB CLI Manual 의 "B. 부록 : 데이터형 " 을참조한다. 개요 11
ODBC API ODBC API에대한자세한내용은 ODBC API Reference 문서 (http://msdn.microsoft.com/enus/library/windows/desktop/ms714562%28v=vs.85%29.aspx) 를참조한다. ODBC Conformance Level 이절은현재 ALTIBASE HDB ODBC 에서현재지원하는함수들과 앞으로지원예정인함수들, 그리고지원되지않는함수들에대하여 ODBC 함수의적합성에입각하여설명한다. ODBC 의적합성레벨을매기는목적은애플리케이션에게 ODBC 드라이버의어떤기능을사용할수있는지에대한정보를제공하기위해서이다. 현재 ODBC 적합성레벨은 Core, Level 1, Level 2 의 3 가지로분류된다. 어떤함수의적합성레벨을만족시키기위해서는드라이버가그레벨에해당하는모든요구사항을충족해야한다. 아래에표는 ODBC 3.x 기준의적합성레벨이다. 이는 ODBC 2.x 의 적합성레벨과차이가있다. ODBC 2.x 에서의적합성레벨 1 은 여기에서 core 로보면된다. ALTIBASE HDB ODBC 드라이버는 ODBC 3.51 스펙을준수한다. 아래표는각 ODBC 함수의레벨과 ALTIBASE HDB ODBC 드라이버의지원여부를나타낸다. 함수이름 레벨 지원여부지원예정 비고 SQLAllocHandle Core O SQLBindCol Core O SQLBindParameter Core O SQLBrowseConnect Level1 X X SQLBulkOperations Level1 O SQLCancel Core O SQLCloseCursor Core O SQLColAttribute Core O SQLColumnPrivileges Level2 X X 칼럼에대한권한은 12 ODBC User's Manual
ALTIBASE HDB 에서 지원하지않음 SQLColumns Core O SQLConnect Core O SQLCopyDesc Core X O SQLDescribeCol Core O SQLDescribeParam Level2 O 완벽하게지원한다고볼수없음 SQLDisconnect Core O SQLDriverConnect Core O SQLEndTran Core O SQLExecDirect Core O SQLExecute Core O SQLFetch Core O SQLFetchScroll Core O SQLForeignKeys Level2 O SQLFreeHandle Core O SQLFreeStmt Core O SQLGetConnectAttr Core O SQLGetCursorName Core O SQLGetData Core O SQLGetDescField Core O ODBC 3.0 SQLGetDescRec Core O ODBC 3.0 SQLGetDiagField Core O ODBC 3.0 SQLGetDiagRec Core O ODBC 3.0 SQLGetEnvAttr Core O SQLGetFunctions Core O SQLGetInfo Core O SQLGetStmtAttr Core O SQLGetTypeInfo Core O SQLMoreResults Level1 O SQLNativeSql Core O SQLNumParams Core O 개요 13
SQLNumResultCols Core O SQLParamData Core O SQLPrepare Core O SQLPrimaryKeys Level1 O SQLProcedureColumns Level1 O SQLProcedures Level1 O SQLPutData Core O SQLRowCount Core O SQLSetConnectAttr Core O SQLSetCursorName Core O SQLSetDescField Core O ODBC 3.0 SQLSetDescRec Core O ODBC 3.0 SQLSetEnvAttr Core O SQLSetPos Level1 O SQLSetStmtAttr Core O SQLSpecialColumns Core O SQLStatistics Core O SQLTablePrivileges Level2 O SQLTables Core O 14 ODBC User's Manual
2. 설치및설정 이장은 ALTIBASE HDB ODBC 드라이버를설치하고설정하는 방법을유닉스계열과윈도우로나누어서설명한다. 설치및설정 15
설치 본절에서는유닉스와윈도우운영체제에서 ALTIBASE HDB ODBC 드라이버를설치하는방법에대해서기술한다. 유닉스계열 유닉스계열의경우 ALTIBASE HDB 서버또는클라이언트패키지를설치할때 ODBC 드라이버도함께설치된다. ALTIBASE HDB 서버또는클라이언트패키지를설치하는방법은 Installation Guide 를참조한다. 64 비트패키지를설치하면아래와같은 32 비트와 64 비트 ODBC 드라이버가모두 $ALTIBASE_HOME/lib 에설치될것이다. libaltibase_odbc-64bit-ul32.so: SQLLEN 의크기가 32 비트 libaltibase_odbc-64bit-ul64.so: SQLLEN 의크기가 64 비트 64 비트패키지에두개의드라이버가포함된이유는다음과같다. 64 비트 ODBC Driver Manager 들은 SQLLEN 타입의크기를 64bit 로정의하고있다. 그러나, 유닉스계열에서사용가능한 ODBC Driver Manager 중의하나인 unixodbc 가버전과컴파일옵션에따라 SQLLEN 의크기를 32bit 또는 64bit 로정의하기때문에, 모두를수용하기위해 ALTIBASE HDB 는두개의드라이버를제공한다. unixodbc 를사용하는경우 SQLLEN 크기가일치하는드라이버를선택하여사용하기바란다. 32 비트패키지를설치하면아래의파일이 $ALTIBASE_HOME/lib 에 위치하게된다. libaltibase_odbc.so HP 운영체제의경우위와동일한파일이름에확장자만 sl 이다. 윈도우 윈도우의경우에도 ALTIBASE HDB 서버또는클라이언트패키지를 설치할때 ODBC 드라이버를함께설치할수있다. ALTIBASE HDB 16 ODBC User's Manual
서버또는클라이언트패키지를설치하는방법은 Installation Guide 를참조한다. 윈도우환경에서는서버또는클라이언트패키지를설치하지않고 ODBC 드라이버파일만설치할수도있다. http://support.altibase.com에서 ODBC 드라이버설치파일을다운로드한후실행하면, ALTIBASE HDB ODBC 드라이버의 DLL이 system 폴더 ( 예를들어, Windows7 의경우 C:\Windows\system32) 에설치된다. 이에대한자세한내용은 Windows ODBC Driver Installer User's Guide를참조한다. 윈도우용 ALTIBASE HDB ODBC 드라이버 DLL 파일의이름은 altiodbc.dll 이다. 설치및설정 17
설정 본절에서는 Unix 와 Windows 에서 ODBC 드라이버를설정하는 방법에대해서기술한다. 유닉스계열 유닉스에서 ODBC 드라이버를사용하기위해서는먼저 ODBC Driver Manager 를설치해야한다. 유닉스용 ODBC Driver Manager 는 unixodbc Driver Manager 와 iodbc Driver Manager 가있다. 각 Driver Manager 에대한자세한내용은아래링크를참조한다. http://www.unixodbc.org/ http://www.iodbc.org/ 윈도우 설치에성공하면, [ 제어판 ] > [ 시스템및보안 ](Windows 7) > [ 관리 도구 ] > [ 데이터원본 (ODBC)] 을실행한후드라이버탭에서 ALTIBASE HDB ODBC 드라이버를확인할수있다. 18 ODBC User's Manual
DSN 추가 ODBC 애플리케이션에서접근하려는데이터베이스에대한 DSN 을추가한다. [ 데이터원본 (ODBC)] 의사용자 DSN 또는시스템 DSN 탭에서 " 추가 " 를누르면아래의대화상자가나타난다. ALTIBASE HDB 용 ODBC 드라이버를선택하고 " 마침 " 을누른다. "Altibase Connection Config" 창이나타나면아래의속성들을 입력한다. Windows DSN Name: 데이터원본의이름을입력한다. host (name or IP): 접속할 ALTIBASE HDB 서버가위치하는장비의호스트이름또는 IP 주소를입력한다. Port (default 20300): ALTIBASE HDB 서버의 listening 포트 설치및설정 19
번호를입력한다. altibase.properties 파일에서 PORT_NO 값을확인하거나 ALTIBASE_PORT_NO 환경변수값을확인한다. User: 데이터베이스사용자이름을입력한다. Password: 데이터베이스사용자비밀번호를입력한다. Database: 데이터베이스이름을입력한다. NLS_USE: 클라이언트의캐릭터셋을입력한다. "Test Connection" 을눌러서접속이정상적으로되는지확인할수 있다. "OK" 를누른후 DSN 탭에서방금입력한이름으로데이터 원본이추가된것을확인할수있다. 20 ODBC User's Manual
3. ODBC 프로그래밍 이장은 ALTIBASE HDB ODBC 드라이버를사용해서 ODBC 애플리케이션을작성하는방법을예제와함께설명한다. ODBC 프로그래밍 21
연결문자열 (Connection String) ALTIBASE HDB ODBC 를사용하여 ODBC 애플리케이션을작성할때 DSN 을사용하는대신에연결문자열을사용할수도있다. 연결 문자열은아래의속성으로구성된다. 속성 DRIVER User Password Server PORT NLS_USE LongDataCompat 설명 ODBC 드라이버의이름. ODBC 데이터원본관리자창에서확인할수있다. 데이터베이스사용자이름데이터베이스사용자비밀번호접속할 ALTIBASE HDB 서버의 IP 주소 ALTIBASE HDB 서버의 listening 포트번호클라이언트의캐릭터셋 ON 또는 OFF BLOB 같은대용량데이터를사용할경우 ON으로설정하길권장한다. 디폴트는 OFF이다. 다음은위의속성들을이용해서구성한연결문자열의예이다. "DRIVER=ALTIBASE_HDB_ODBC_64bit;User=SYS;Password=xxx;Server= 127.0.0.1;PORT=20300;NLS_USE=US7ASCII;LongDataCompat=OFF" 22 ODBC User's Manual
기본프로그래밍예제 ODBC 애플리케이션에서 ALTIBASE HDB 서버에접속하고종료하는예제코드과애플리케이션수행결과는다음과같다. 예제 /* test_odbc.cpp */ #include <windows.h> #include <sql.h> #include <sqlext.h> #include <stdio.h> #include <stdlib.h> #define SQL_LEN 1000 #define MSG_LEN 1024 SQLHENV SQLHDBC SQLHSTMT SQLRETURN henv; hdbc; hstmt; retcode; void execute_err(sqlhstmt stat, char* q) printf("error : %s\n",q); SQLINTEGER errno; SQLSMALLINT msglength; SQLTCHAR errmsg[msg_len]; if (SQL_SUCCESS == SQLError ( henv, hdbc, stat, NULL, &errno, errmsg, MSG_LEN, &msglength )) printf(" Error : # %lld, %s\n", errno, errmsg); SQLFreeStmt(stat, SQL_DROP); if (SQL_ERROR == SQLDisconnect(hdbc)) printf("disconnect error\n"); SQLFreeConnect(hdbc); SQLFreeEnv(henv); exit (1); void main() char *DSN, *DBNAME, *USERNAME, *PASSWD, *PORTNO; char query[sql_len], name[21]; int age; SQLCHAR constr[100]; SQLINTEGER len; DSN = "ALTIBASE"; // Domain Server Name /* Environment 을위한메모리를할당 */ if(sqlallocenv(&henv) == SQL_ERROR) printf("allocenv error!!\n"); ODBC 프로그래밍 23
exit(1); /* Connection 을위한메모리를할당 */ if(sqlallocconnect(henv, &hdbc) == SQL_ERROR) printf("allocdbc error!!\n"); SQLINTEGER errno; SQLSMALLINT msglength; SQLTCHAR errmsg[msg_len]; if (SQL_SUCCESS == SQLError ( henv, NULL, NULL, NULL, &errno, errmsg, MSG_LEN, &msglength )) printf(" Error : # %lld, %s\n", errno, errmsg); exit(1); /* Connection 을형성 */ sprintf((char*)constr, "DSN=%s", DSN); if ( SQLDriverConnect(hdbc, NULL, constr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE)) printf("dbname = %s\n", DBNAME); printf("username = %s\n", USERNAME); printf("connection error!!\n"); SQLINTEGER errno; SQLSMALLINT msglength; SQLTCHAR errmsg[msg_len]; if (SQL_SUCCESS == SQLError ( henv, hdbc, NULL, NULL, &errno, errmsg, MSG_LEN, &msglength )) printf(" Error : # %lld, %s\n", errno, errmsg); SQLFreeConnect(hdbc); SQLFreeEnv(henv); exit(1); printf("connected...\n"); /* statement 을위한메모리를할당 */ if ( SQLAllocStmt(hdbc, &hstmt) == SQL_ERROR ) printf("allocstmt error!!\n"); SQLDisconnect(hdbc); SQLFreeConnect(hdbc); SQLFreeEnv(henv); exit(1); /* 쿼리수행 */ sprintf(query,"drop TABLE TEST001"); SQLExecDirect(hstmt,(SQLTCHAR*)query, SQL_NTS); sprintf(query,"create TABLE TEST001 ( name varchar(20), age number(3) )"); if (SQL_ERROR == SQLExecDirect(hstmt,(SQLTCHAR*)query, SQL_NTS)) 24 ODBC User's Manual
execute_err(hstmt, query); /* statement 를준비하고변수를바인드한다. */ sprintf(query,"insert INTO TEST001 VALUES(?,? )"); if (SQL_ERROR == SQLPrepare(hstmt, (SQLTCHAR*)query, SQL_NTS)) execute_err(hstmt, query); if (SQL_ERROR == SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 0, 0, name, 19, &len)) printf("sqlbindparameter error!!! ==> %s \n",query); exit(1); if (SQL_ERROR == SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_NUMERIC, 0, 0, &age, 0, &len)) printf("sqlbindparameter error!!! ==> %s \n",query); exit(1); /* 준비된 statement를수행 */ sprintf(name, " 김민석 "); age = 28; if (SQL_ERROR == SQLExecute(hstmt)) execute_err(hstmt, query); sprintf(name, " 홍길동 "); age = 25; if (SQL_ERROR == SQLExecute(hstmt)) execute_err(hstmt, query); sprintf(name, " 아무개 "); age = 34; if (SQL_ERROR == SQLExecute(hstmt)) execute_err(hstmt, query); sprintf(query,"select * FROM TEST001"); if (SQL_ERROR == SQLExecDirect(hstmt,(SQLTCHAR*)query, SQL_NTS)) execute_err(hstmt, query); /* Select 의결과값을변수에저장 */ if (SQL_ERROR == SQLBindCol(hstmt, 1, SQL_C_CHAR, name, 21, &len)) printf("sqlbindcol error!!!\n"); exit(1); ODBC 프로그래밍 25
if (SQL_ERROR == SQLBindCol(hstmt, 2, SQL_C_SLONG,&age, 0, &len)) printf("sqlbindcol error!!!\n"); exit(1); while ( SQLFetch(hstmt) == SQL_SUCCESS) // 결과값이있는동안결과값을받아화면에출력 */ printf("name : %5s, Age : %5ld\n",name,age); /* 모든 handle 을해제하고접속을종료 */ SQLFreeStmt(hstmt, SQL_DROP); SQLDisconnect(hdbc); SQLFreeConnect(hdbc); SQLFreeEnv(henv); 실행결과 Visual C++ 에서컴파일후생성된 exe 파일을실행시키면다음과같은결과를볼수있다. 26 ODBC User's Manual
Visual C++ 예제 #include <Afx.h> #include <Afxdb.h> #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) CDatabase db; try db.openex(_t("dsn=altibase ), CDatabase::noOdbcDialog); AfxMessageBox (_T("Connect OK")); catch (CDBException *e) AfxMessageBox(e->m_strError); return 0; 다음은 VC++ 에서 ADO 를사용한예제이다. #include "stdafx.h" #include "windows.h" #import "C:\Program Files\Common Files\System\ado\msado15.dll" \ no_namespace rename("eof", "adoeof") int _tmain(int argc, _TCHAR* argv[]) _ConnectionPtr pcon = NULL; try CoInitialize(NULL); pcon.createinstance ( uuidof(connection)); pcon->mode = admodereadwrite; pcon->open("dsn=altibase", "", "", adconnectunspecified); MessageBox(NULL, (LPCSTR)"Successfully Connected.", (LPCSTR)"OK", 0); CoUninitialize(); catch (_com_error &ce) MessageBox(NULL, ce.errormessage(), (LPCSTR)"Error", 0); return 0; ODBC 프로그래밍 27
Visual C# 예제 Sub Main() Dim cn As Odbc.OdbcConnection Dim cmd As Odbc.OdbcCommand Dim dr As Odbc.OdbcDataReader cn = New Odbc.OdbcConnection cmd = New Odbc.OdbcCommand cn.connectionstring = "DSN=ALTIBASE" Try cn.open() Console.WriteLine("Successfully Connected.") cmd.connection = cn cmd.commandtext = "SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') FROM DUAL" dr = cmd.executereader() While (dr.read()) Console.WriteLine(dr.GetString(0)) End While Catch ex As Odbc.OdbcException Console.WriteLine(" 연결에오류가있습니다." + ex.message) End Try Console.ReadLine() End Sub 28 ODBC User's Manual
Visual Basic 예제 Sub Main() Dim cn As Odbc.OdbcConnection Dim cmd As Odbc.OdbcCommand Dim dr As Odbc.OdbcDataReader cn = New Odbc.OdbcConnection cmd = New Odbc.OdbcCommand cn.connectionstring = "DSN=ALTIBASE" Try cn.open() Console.WriteLine("Successfully Connected.") cmd.connection = cn cmd.commandtext = "SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') FROM DUAL" dr = cmd.executereader() While (dr.read()) Console.WriteLine(dr.GetString(0)) End While Catch ex As Odbc.OdbcException Console.WriteLine(" 연결에오류가있습니다." + ex.message) End Try Console.ReadLine() End Sub ODBC 프로그래밍 29
LOB 사용예제 이절은 ALTIBASE HDB ODBC 드라이버를사용해서 LOB 데이터를 조작하는방법을예제를통해살펴본다. ALTIBASE HDB 의 LOB Locator 특성상세션의자동커밋을해제한상태 (Non-autocommit) 에서 LOB 데이터를조작해야한다. 자세한내용은 ALTIBASE HDB CLI Manual 에서 3 장 LOB 인터페이스를참조한다. 또한다음과같이연결문자열에서 LongDataCompat 속성을 ON 으로설정해야한다. "DSN=ALTIBASE;LongDataCompat=ON" 또는 "DRIVER=ALTIBASE_HDB_ODBC_64bit;User=SYS;Password=xxx;Server= 127.0.0.1;PORT=20300;NLS_USE=US7ASCII;LongDataCompat=ON" 아래는 C# 에서 BLOB 데이터를테이블에삽입하고조회하는 예제이다. FileStream fs = new FileStream("c:\\test.dat", FileMode.Open, FileAccess.Read); Byte[] blob = new byte[fs.length]; fs.read(blob, 0, System.Convert.ToInt32(fs.Length)); fs.close(); OdbcTransaction tx = cn.begintransaction(); cmd.transaction = tx; cmd.commandtext = "INSERT INTO T1 (C1, C2) VALUES (?,?)"; cmd.parameters.add("c1", OdbcType.Int); cmd.parameters.add("c2", OdbcType.Binary); cmd.parameters[0].value = 1; cmd.parameters[1].value = blob; cmd.executenonquery(); tx.commit(); // BLOB SELECT cmd.commandtext = "SELECT binary_length(c2), C2 FROM T1"; tx = cn.begintransaction(); cmd.transaction = tx; OdbcDataReader dr = cmd.executereader(); int len; while (dr.read()) len = dr.getint32(0); Byte[] ff = new Byte[len]; dr.getbytes(1, 0, ff, 0, len); 30 ODBC User's Manual
fs = new FileStream("c:\\test.dat", FileMode.CreateNew, FileAccess.Write); fs.write(ff, 0, len); fs.close(); ODBC 프로그래밍 31
찾아보기 C Conformance Level... 12 Connection String... 22 D DSN 추가... 19 I iodbc Driver Manager... 18 L LOB... 30 U unixodbc Driver Manager... 18 V Visual Basic... 29 Visual C#... 28 Visual C++... 27 ㄷ데이터원본 (ODBC)... 18 ㅅ설정... 18 설치... 16 소개... 10 ㅇ연결문자열... 22 ㅈ 적합성레벨... 12 찾아보기 33