[c] C/C++ 에서 MySQL 연동하기 Sample (unixODBC 이용)
http://blog.junghun.com/220245681954
Driver Download
설치
– 다운로드 받은 파일 (unixODBC-2.3.1.tar.gz) 의 압축을 푼다.
– 압축푼 경로로 이동.
– ./configure
– make
– make install
package install
CentOS 상에 설치하는 것 이라면… 위의 방법보단, 아래를 추천한다.
yum install mysql-connector-odbc
연관 패키지로, libtool-ltdl, unixODBC 가 설치 된다.
~/.odbc.ini 생성
[DEV_XXXX_MYSQL]
Driver = MySQL
Description = myodbc
Server = IP
Port = PORT
Database = DATABASE
charset = utf8
USER = ID
PASSWORD = PW
cs
/usr/local/etc/odbcinst.ini
odbcinst -j 를 했을 때, 나오는 DRIVERS 경로를 수정해 주어야 한다.
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib64/libmyodbc5.so
Setup = /usr/lib64/libodbcmyS.so
Driver64 = /usr/lib64/libmyodbc5.so
Setup64 = /usr/lib64/libodbcmyS.so
cs
ODBC 드라이버 테스트
Sample Code
#include <stdio.h>
#include <string.h>
#include <sql.h>
#include <sqlext.h>
int main() {
SQLHENV env; // Handle ODBC enviroment
SQLHDBC dbc; // Handle connection
SQLHSTMT stmt; // Handle statement
SQLLEN err;
SQLLEN rowanz;
SQLSMALLINT colanz;
char buffer[200];
int tmpMediaID;
long res;
memset(buffer, 0x00, sizeof(buffer));
/*
* 환경, 연결, 그리고 명령문 핸들을 위한 메모리를 할당하고 초기화 한다.
*/
SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
/*
* ODBC: Version: Set
* (현재 환경에 대한 환경 속성을 설정한다.)
*/
SQLSetEnvAttr( env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// DBC: Allocate
SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc);
/*
* DB와의 연결을 설정한다.
*/
res = SQLConnect( dbc, (SQLCHAR*)"DATABASE", SQL_NTS,
(SQLCHAR*)"ID", SQL_NTS,
(SQLCHAR*)"PW", SQL_NTS);
printf("접속결과 : %ld\n", res);
/*
* 명령핸들ID 할당.
* https://kb.askmonty.org/en/sqlallochandlesql_handle_stmt/
*/
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
/*
* 모든 데이터 타입에 대해 애플리케이션 변수들을 (application data buffers) 결과 집합의 열들에 바인드한다.
*/
SQLBindCol(stmt, 1 , SQL_C_LONG, &tmpMediaID, sizeof(tmpMediaID), &err);
SQLBindCol(stmt, 2 , SQL_C_CHAR, buffer, sizeof(buffer), &err);
/*
* 주어진 SQL 문장을 직접 실행
*/
SQLExecDirect(stmt, (SQLCHAR *)"SELECT MEDIAID, MEDIANAME FROM DAWIN.TMEDIA", SQL_NTS);
/*
* 결과 집합의 열의 개수를 반환한다.
*/
SQLNumResultCols(stmt, &colanz);
printf("컬럼 수 : %d\n", colanz);
/*
* Row 수 확인.
*/
SQLRowCount(stmt, &rowanz);
printf("로우 수 : %ld\n", rowanz);
/*
* 결과 집합의 다음 행으로 커서를 진행시키고 바인드된 열을 가져온다.
*/
while(SQLFetch(stmt) != SQL_NO_DATA)
{
printf("Result: %d, %s\n", tmpMediaID, buffer);
}
/*
* 특정한 환경, 연결, 그리고 명령문 핸들과 관련된 자원들을 해제한다.
*/
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
/*
* 특정 연결 핸들과 관련된 연결을 종료한다.
*/
SQLDisconnect( dbc );
SQLFreeHandle( SQL_HANDLE_DBC, dbc );
SQLFreeHandle( SQL_HANDLE_ENV, env );
printf("\n");
return 0;
}
Compile
cc -o DB_Test DB_Test.c -lodbc