글
간단하게나마 DB에서 가장 많이 사용되는 ( 게임용 DB 로도 가장 많이 사용 되는 )
MySQL For C API 에 대해서 알아 보고 최후로 DB 접근을 하기 위한 종단 서버 구성으로
마쳐 볼까 합니다 :)
이것 역시 언제 끝날지는 알 수 없습니다 시간 날 때마다 하겠습니다.
개인적으로 sql query문이 제가 약한 관계로 :) 제대로 된 글이 될 거라는 생각은 안 합니다.
휴 정말 간만에 들어오네요 :) 제가 너무 정신이 없어서
( 논다고 바빳습니다. 기다리는 분은 전혀 없었겠지만 )
2번에 나놔서 정리 할까 합니다.
첫번째로는 함수 나열과 정리를 하고 두번째는 실전 소스로 나눠서 정리할까 합니다.
실제 많은 api함수들이 있지만 자주 사용하는 것 몇가지만 알아보겠습니다.
아.. VS6에서는 컴파일을 위해서는
MYSQL/INCLUDE 폴더를 포함시켜 주시고 libmysql.lib를 포함 시키지 않으면
반가운 링크에러들이 뜰겁니다.
리눅스에서는 make 파일에 여러가지를 추가 시켜야겠죠.
정확한 include 파일 경로를 찾으려면,
# find / -name mysql.h
정확한 공유 라이브러리 파일 경로를 찾으려면,
# find / -name libmysqlclient.so
하시면 됩니다.
INC = -I/usr/local/mysql/include/ // 기본적인 mysql.h 위치입니다.
LIB = -L/usr/local/mysql/lib/ // libmysql.lib 이 있는 곳의 위치 입니다.
LIBS= -lmysqlclient // lib 파일이죠
$(TARGET) : $(OBJS)
$(CXX) $(LDFLAGS) $(LIBS) -o $(TARGET) $(OBJS)
와 같이 하면 컴파일에 문제가 없을겁니다.
컴파일 얘기는 다음에 한번더 자세하게 makefile과 함께 하고 오늘은 자주 사용하는 함수만
정리 하겠습니다.
| __mysql_init()__ | mysql 초기화 함수 입니다.return 값은 연결식별값 (MYSQL*) 실패하면 FALSE 가 리턴 됩니다.
| __mysql_connect()__ 또는 __mysql_real_connect()__ | mysql 접속 함수 입니다.mysql_real_connect() 함수만을 이용합니다.
| __mysql_select_db()__ | mysql DB 선택 함수입니다. 어떤 DB를 선택 할것인지 하는 것이죠
| __mysql_close()__ | mysql을 서버와의 접속을 끊습니다.
| __mysql_query()__ | 쿼리를 실행 시킵니다.
| __mysql_fetch_row()__ | Result Set 에서 하나의 로우를 배열로 가져 옵니다.
| __mysql_store_result()__ | Result Set 을 저장 합니다.
| __mysql_free_reslut()__ | Result Set 을 메모리에서 제거 합니다.
| __mysql_errno()__ | 에러 번호를 리턴합니다.
| __mysql_error()__ | 에러에 대한 설명을 리턴합니다.
이제는 저 위에 함수들을 어떻게 사용 하는가에 대해서 간단한 예문을 통해서
알아 볼까 합니다.
지금 위키에서 바로 코딩을 하는 관계로 컴파일이 안 될수도 있습니다 (__)
그냥 어떻게 사용하는가만 알아 보자는 겁니다.
#define dDB_HOST"아이피"
#define dDB_PORT3306
#define dDB_ID"아이디"
#define dDB_PW"db 패스워드"
#define dDB_NAME"DB 명 "
#include <mysql.h>
MYSQL* mysql;
MYSQL *DBConnect( char * host , int port , char *id , char *pw , char *dbName )
{
MYSQL *db = NULL;
db = mysql_init( (MYSQL*)NULL );// 초기화 함수
if( db )
{
if( mysql_real_connect( db, host, id, pw, NULL, port, (char*)NULL, 0 ) ) // DB 접속
{
if( mysql_select_db( db, dbName ) != 0 ) // DB 선택
{
mysql_close( db );
return NULL;
}
}
else // connect error
{
printf( "Error %d ( %s )\n", mysql_errno( db ), mysql_error( db ) );
mysql_close( db );
return NULL;
}
}
else
return NULL;
return db;
}
int main()
{
mysql = DBConnect( dDB_HOST , dDB_PORT, dDB_ID , dDB_PW, dDB_DBNAME );
if( ! mysql )
{
return -1 ;
}
char Query[128];
sprintf( Query," select ......등등 필요한 쿼리들" );
if( !mysql_query ( mysql, Query))
{
MYSQL_RES *result = mysql_store_result( mysql );
if( result )
{
MYSQL_ROW row;
row = mysql_fetch_row( result );
// 그리고 각 원하는 것들을 여기에다가 변수에 저장 한다.
// id= atoi ( row[0] ) ; 이런 식으로 ...
}
mysql_free_result( result );
}
mysql_close( mysql );
return 0;
}
정말 간만에 수정 하는 군요 -_-+
몇마디 더 추가 하고자 이렇게 글을 올리게 됐네요
$ gcc -o mysql mysql.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient
이런식으로적으면 컴파일이 돼겠습니다요
이렇게 하면 mysql 이라는 게 생기겠죠
뭐 더 확실하게 알아 보고자 하면 연결 완료 나 종료에 대해서 printf 문등을 통해서 알아보던지아니면 로그파일로 남기셔도 될듯하고요
여기서 주의 할점은 Mysql For C API를 사용할때는 -lmysqlclient 이 녀석입니다. 라이브러리를 연결 하는 녀석이죠.
libmysqlclient.so 를 찾아서 링크 시켜 주는 역할을 합니다.
자 여기서 C API 의 자료형에 대해서 몇가지 알아 보겠습니다.
|MYSQL|Database와의 연결을 관리하는 구조체입니다.
|MYSQL_RES|SELECT 등 결과를 리턴하는 query의 결과를 나타내는 자료형입니다.
|MYSQL_ROW|MYSQL_RES에서 하나의 레코드씩 값을 얻어 올때 쓰이는 자료형입니다.
|MYSQL_FIELD|필드의 이름과 필드의 타입 등 필드에 관한 정보를 저장하는 자료형입니다.
(에러 문구는 mysql for C API 문서에서 발견을 했는데 출처를 모르겠군요 )
이번에는Mysql For C API 를 이용하면서 나올 에러들에 대해서 대처해보기 위해서 에러에 대해서 알아 보겠습니다.
1) "msyql.c:2: mysql.h: 그런 파일이나 디렉토리가 없음"
;:이 경우는 mysql.h의 경로를 찾을 수 없어서 나는 에러입니다. 다시 한번 mysql.h가 어디에 있는지 확인을 하고, -I옵션으로 그 경로를 지정해야 합니다.
이럴때 whereis 나 find 등을 잘써서 찾아 봅시다.
뭐 기본적으로 기본 경로에설치하면 아무 문제 없습니다.
2) "mysql.o(.text+0x11): undefined reference to `mysql_init'"
;:위와 같이 'undefined reference......' 라고 나오는 에러는 -lmysqlclient 옵션을 안줘서 생기는 에러 입니다.
3) "ld: cannot open -lmysqlclient: 그런 파일이나 디렉토리가 없음"
;:위의 에러는 -L옵션 뒤에 붙은 라이브러리의 경로가 잘못 되었을때 생깁니다. libmysqlclient.so 파일의 경로를 찾아서 그 경로 지정을 해주시면 됩니다.
4) "Can't connect to local MySQL server "
;:위의 에러는 MySQL의 서버에 연결을 할 수 없다는 메시지로서,
MySQL 서버의 데몬이 실행 중이지 않을 때 나오는 메시지입니다.
5) "Access denied for user: 'root@localhost' (Using password: YES)"
;:사용자 아이디를 잘못 입력하거나, 암호를 잘못 입력하였을 때 나오는 메시지입니다.
MySQL의 사용자는 모두 mysql database의 user 테이블에 있습니다.
6) "./sql: error in loading shared libraries libmysqlclient.so.6: cannot open shared object file: No such file or directory"
;:MySQL의 라이브러리를 열지 못한다는 메시지입니다.
컴파일 할 때 MySQL의라이브러리를 사용하는데, 동적 라이브러리이므로 실행시에도
라이브러리가 필요하게 된다.
ibmysqlclient.so가 /usr/lib 혹은 /usr/lib/mysql 디렉터리에 존재 하지 않을 경우에 발생하는
문제입니다.
/etc/ld.so.conf 파일에libmysqlclient.so가 있는 경로를 적어 준 후에 ldconfig 라는 명령을
프롬프트에서 실행하여 주면 됩니다.
원본출처 : http://ngps.net/ngpiki/index.php?display=MySqlForCApi
'MySQL' 카테고리의 다른 글
MySQL C-API Example (0) | 2006.11.20 |
---|---|
MySQL C API 로 unicode 데이터 insert 하기 (0) | 2006.11.19 |
MySQL C API 설명 (0) | 2006.11.19 |
Mysql C API를 이용한 초간단 회원 관리 (0) | 2006.11.19 |
Mysql Tip (0) | 2006.05.14 |
RECENT COMMENT