[unixODBC를 이용하여 MySQL서버 접속하기]
* 준비하기
1. 접속할 MySQL서버의 계정을 얻는다.
2. unixODBC를 다운받아서 깐다. (http://sql.kldp.org/snapshots/tools 에도 있음)
3. MyODBC를 다운받아서 깐다. (http://sql.kldp.org/snapshots/tools 에도 있음)
4. ODBCConfig를 써서 MySQL ODBC 드라이버를 추가한다. (/usr/local/bin에 있음)
5. ODBCConfig를 써서 데이타 소스 이름을 추가한다.
6. 4, 5를 하면 /usr/local/etc/odbcinst.ini와 /usr/local/etc/odbc.ini 에 다음과 같이 추가된다.
예)
* odbcinst.ini 파일 (/usr/local/etc에 있음)
[myodbc]
Description = MySQL driver
Driver = /usr/local/lib/libmyodbc-2.50.36.so
Setup = /usr/local/lib/libodbcmyS.so
FileUsage = 1
CPTimeout =
CPReuse =
* odbc.ini 파일 (/usr/local/etc에 있음)
[mysqltest]
Description = myodbc
Driver = myodbc
Trace = Yes
TraceFile = ~/mysql.log
Server = localhost
Port = 3306
Socket =
Database = mysql
odbcinst.ini파일에는 추가한 MySQL드라이버가 보이고, odbc.ini파일에는 데이타 소스 이름이 들어간다.
한가지 주의 할 것은 odbc.ini파일은 시스템용과 사용자용이 있는데, 시스템용은 /usr/local/etc에 있고, 사용자용은 ~/.odbc.ini에 있다.
아래는 MySQL 서버에 접속해서 간단한 질의를 하는 예이다.
#include <stdlib.h>
#include <stdio.h>
// odbc header
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
// odbc header end
SQLHENV V_OD_Env; // Handle ODBC enviroment
long V_OD_erg; // result of functions
SQLHDBC V_OD_hdbc; // Handel connection
SQLHSTMT V_OD_hstmt; // Handle statement
char V_OD_stat[10]; // status SQL
SQLINTEGER V_OD_err, V_OD_rowanz, V_OD_id;
SQLSMALLINT V_OD_mlen, V_OD_colanz;
char V_OD_msg[200], V_OD_buffer[200];
int main(int argc, char **argv)
{
V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &V_OD_Env);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHandlen");
exit(0);
}
else
{
printf("Success AllocHandlen");
}
V_OD_erg = SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SetEnvn");
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success SetEnvn");
}
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHDB %dn", V_OD_erg);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success AllocHDBn");
}
V_OD_erg = SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR *)"mysqltest", SQL_NTS, (SQLCHAR *)"sise15", SQL_NTS, (SQLCHAR *)"xxxxxxx", SQL_NTS);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success SQLConnectn");
}
V_OD_erg = SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocStatement %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success AllocStatementn");
}
SQLBindCol(V_OD_hstmt, 1 , SQL_C_CHAR, &V_OD_buffer, 150, &V_OD_err);
V_OD_erg = SQLExecDirect(V_OD_hstmt, (SQLCHAR *)"SELECT host from user", SQL_NTS);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error ExecDirect %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success ExecDirectn");
}
V_OD_erg = SQLNumResultCols(V_OD_hstmt, &V_OD_colanz);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error NumResultCols %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success NumResultColsn");
}
printf("Number of Columns %dn", V_OD_colanz);
V_OD_err = SQLRowCount(V_OD_hstmt, &V_OD_rowanz);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error RowCount %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success RowCountn");
}
printf("Number of Rows %dn", V_OD_rowanz);
printf("========== Result ==========n");
V_OD_erg = SQLFetch(V_OD_hstmt);
while(V_OD_erg != SQL_NO_DATA)
{
printf("Result: %sn", V_OD_buffer);
V_OD_erg = SQLFetch(V_OD_hstmt);
}
printf("======== Result end ========n");
SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
return(0) ;
}
위 코드를 odbctest.cxx 로 저장한다.
이것을 컴파일하면,
g++ -o odbctest odbctest.cxx -lodbc
이것을 실행하면,
$ ./odbctest
Success AllocHandle
Success SetEnv
Success AllocHDB
get :00000::100
Success SQLConnect
Success AllocStatement
Success ExecDirect
Success NumResultCols
Number of Columns 1
Success RowCount
Number of Rows 5
========== Result ==========
Result: localhost
Result: localhost
Result: localhost
Result: sise15.mizi.com
Result: sise15.mizi.com
======== Result end ========
* 준비하기
1. 접속할 MySQL서버의 계정을 얻는다.
2. unixODBC를 다운받아서 깐다. (http://sql.kldp.org/snapshots/tools 에도 있음)
3. MyODBC를 다운받아서 깐다. (http://sql.kldp.org/snapshots/tools 에도 있음)
4. ODBCConfig를 써서 MySQL ODBC 드라이버를 추가한다. (/usr/local/bin에 있음)
5. ODBCConfig를 써서 데이타 소스 이름을 추가한다.
6. 4, 5를 하면 /usr/local/etc/odbcinst.ini와 /usr/local/etc/odbc.ini 에 다음과 같이 추가된다.
예)
* odbcinst.ini 파일 (/usr/local/etc에 있음)
[myodbc]
Description = MySQL driver
Driver = /usr/local/lib/libmyodbc-2.50.36.so
Setup = /usr/local/lib/libodbcmyS.so
FileUsage = 1
CPTimeout =
CPReuse =
* odbc.ini 파일 (/usr/local/etc에 있음)
[mysqltest]
Description = myodbc
Driver = myodbc
Trace = Yes
TraceFile = ~/mysql.log
Server = localhost
Port = 3306
Socket =
Database = mysql
odbcinst.ini파일에는 추가한 MySQL드라이버가 보이고, odbc.ini파일에는 데이타 소스 이름이 들어간다.
한가지 주의 할 것은 odbc.ini파일은 시스템용과 사용자용이 있는데, 시스템용은 /usr/local/etc에 있고, 사용자용은 ~/.odbc.ini에 있다.
아래는 MySQL 서버에 접속해서 간단한 질의를 하는 예이다.
#include <stdlib.h>
#include <stdio.h>
// odbc header
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
// odbc header end
SQLHENV V_OD_Env; // Handle ODBC enviroment
long V_OD_erg; // result of functions
SQLHDBC V_OD_hdbc; // Handel connection
SQLHSTMT V_OD_hstmt; // Handle statement
char V_OD_stat[10]; // status SQL
SQLINTEGER V_OD_err, V_OD_rowanz, V_OD_id;
SQLSMALLINT V_OD_mlen, V_OD_colanz;
char V_OD_msg[200], V_OD_buffer[200];
int main(int argc, char **argv)
{
V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &V_OD_Env);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHandlen");
exit(0);
}
else
{
printf("Success AllocHandlen");
}
V_OD_erg = SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SetEnvn");
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success SetEnvn");
}
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHDB %dn", V_OD_erg);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success AllocHDBn");
}
V_OD_erg = SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR *)"mysqltest", SQL_NTS, (SQLCHAR *)"sise15", SQL_NTS, (SQLCHAR *)"xxxxxxx", SQL_NTS);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success SQLConnectn");
}
V_OD_erg = SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocStatement %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success AllocStatementn");
}
SQLBindCol(V_OD_hstmt, 1 , SQL_C_CHAR, &V_OD_buffer, 150, &V_OD_err);
V_OD_erg = SQLExecDirect(V_OD_hstmt, (SQLCHAR *)"SELECT host from user", SQL_NTS);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error ExecDirect %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success ExecDirectn");
}
V_OD_erg = SQLNumResultCols(V_OD_hstmt, &V_OD_colanz);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error NumResultCols %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success NumResultColsn");
}
printf("Number of Columns %dn", V_OD_colanz);
V_OD_err = SQLRowCount(V_OD_hstmt, &V_OD_rowanz);
if((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error RowCount %dn", V_OD_erg);
SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc, 1, (SQLCHAR *)V_OD_stat, &V_OD_err, (SQLCHAR *)V_OD_msg, 100, &V_OD_mlen);
printf("%s (%d)n",V_OD_msg, V_OD_err);
SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
exit(0);
}
else
{
printf("Success RowCountn");
}
printf("Number of Rows %dn", V_OD_rowanz);
printf("========== Result ==========n");
V_OD_erg = SQLFetch(V_OD_hstmt);
while(V_OD_erg != SQL_NO_DATA)
{
printf("Result: %sn", V_OD_buffer);
V_OD_erg = SQLFetch(V_OD_hstmt);
}
printf("======== Result end ========n");
SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt);
SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
return(0) ;
}
위 코드를 odbctest.cxx 로 저장한다.
이것을 컴파일하면,
g++ -o odbctest odbctest.cxx -lodbc
이것을 실행하면,
$ ./odbctest
Success AllocHandle
Success SetEnv
Success AllocHDB
get :00000::100
Success SQLConnect
Success AllocStatement
Success ExecDirect
Success NumResultCols
Number of Columns 1
Success RowCount
Number of Rows 5
========== Result ==========
Result: localhost
Result: localhost
Result: localhost
Result: sise15.mizi.com
Result: sise15.mizi.com
======== Result end ========
'UNIX_LINUX_C_C++' 카테고리의 다른 글
오픈소스 기능별 정리 (0) | 2011.10.16 |
---|---|
GNU REGEX (정규표현식) 프로그래밍 강좌 (1) (0) | 2011.10.16 |
Linux에서 MS-SQL에 접속하기 - FreeTDS (0) | 2011.10.16 |
[FreeTDS] Linux 에서 MSSQL 연동 FreeTDS의 Compile 및 Install (0) | 2011.10.16 |
정규식 / 정규표현식 regex++ (0) | 2011.10.16 |