RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
출처 블로그 > 헤즐넛 - 더욱 강렬하게
원본 http://blog.naver.com/designfull/120000669782

자료출처 : http://ngps.net/ngpiki/index.php?display=MySqlForCApi

간단하게나마 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_PORT  3306#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 의 자료형에 대해서 몇가지 알아 보겠습니다.

MYSQLDatabase와의 연결을 관리하는 구조체입니다.
MYSQL_RESSELECT 등 결과를 리턴하는 query의 결과를 나타내는 자료형입니다.
MYSQL_ROWMYSQL_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 라는 명령을 프롬프트에서 실행하여 주면 됩니다.
2006/09/08 12:35 2006/09/08 12:35
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)