database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Devel 20896 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 20896
MySQL CAPI
작성자
정재익(advance)
작성일
2004-01-26 11:32
조회수
14,028

MySQL For C API

 

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


|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

이 글에 대한 댓글이 총 1건 있습니다.

헛 >_< NGPS에 올린 제글이군요 상당히 놀래 -_-+ 버렸답니다 이런 유명한곳까지 와버릴줄이야

화니(bytes)님이 2004-03-26 20:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
21042MySQL UDF - Fast realtime compressor
정재익
2004-02-16
6544
21041MySQL UDF - substr_count
정재익
2004-02-16
7657
21040Converts Ethernet MAC Address string to uint64 and backwards
정재익
2004-02-16
6774
20896MySQL CAPI [1]
정재익
2004-01-26
14028
20895MySQL ADO 사용 [1]
정재익
2004-01-26
12627
17897MySQL2006에러(..gone away)
김태훈
2002-11-22
7586
16661[C Src] MySQL Optimize 0.1pre10 [소스]
정재익
2002-07-30
9973
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다