MySQL C-API Example

MySQL 2006. 11. 20. 18:38
		MySQL과 C로 만든 프로그램을 연동하는 예제를 짜 봤습니다.		그다지 좋은 예는 아니지만,, 어떻게 돌아가는지 참고 정도는		할 수 있습니다. 소스1. 	예제로 짜볼 프로그램은 '친구 찾기'입니다. 	telnet으로 서버에 접속하여, 검색 조건을 넣고, 	찾기를 하면 원하는 친구를 찾아서 정보를 보여 줍니다.	만들기 쉽게 하기 위하여, 네트웍 프로그래밍은 안 썼습니다.	단순히 telnet으로 접속을 하고, login에서 아이디를 치면	그 사용자의 SHELL이 뜰텐데 (일반적이라면 본쉘이나, C 쉘이 뜨겟져)	이 SHELL을 우리가 만든 프로그램으로 바꾸어 버립니다. 	가장 간단한 방법이라고 생각합니다. 	보안상 논캐너니컬 모드로 바꿔줘야 하는데, 제가 이 부분은 제가	잘 모르겠네여.	단순히 예제로 쓰이기 위하여 최소 사항만 구현을 합니다.2. 사용자 추가 하기.	일단 친구 검색 프로그램을 쓸 User를 추가하기로 하져.	#adduser inos 		새로운 사용자가 생겼습니다. 암호는 없도록 합시다. (/etc/passwd 파일에서	암호에 관한 부분을 지워버리면 됩니다.)		MySQL에도 사용자를 추가해 보져.	보안상 새로 추가할 사용자는 Select만 할 수 있는 권한을 	주기로 합니다. 	위의 강좌에서 mysql DB의 user Table에 사용자에 관한 	설정이 있다는 것을 기억하시져? 	# mysql mysql	mysql> select * from user ;	+-----------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+	| Host      | User    | Password         | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv |	+-----------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+	| localhost | root    |                  | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         |	| localhost |         |                  | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         |	| localhost | pds     | 77fca4775957e5d4 | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         |	| localhost | newuser | 7b17bc5522ac2590 | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         |	+-----------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+	4 rows in set (0.00 sec)	다음과 같이 사용자를 추가합니다.	mysql> insert into user values ('localhost', 'inos',password('hjshjs'), 'Y','N','N','N','N','N','N','N','N','N') ;	Query OK, 1 row affected (0.12 sec)	확인을 해볼까요?	mysql> select * from user ;	+-----------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+	| Host      | User    | Password         | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv |	+-----------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+	| localhost | root    |                  | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         |	| localhost |         |                  | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         |	| localhost | pds     | 77fca4775957e5d4 | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         |	| localhost | newuser | 7b17bc5522ac2590 | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         |	| localhost | inos    | 4e2eb14c2c15d95e | Y           | N           | N           | N           | N           | N         | N           | N             | N            | N         |	+-----------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+	5 rows in set (0.00 sec)	추가된 것을 확인하셨져?	사용자를 추가할 때 password('hjshjs')부분을 보셨나요? 	패스워드를 암호화 하여 테이블에 삽입합니다. Select_priv만 Y이므로 	inos라는 User는 select 문만을 사용할 수 있습니다.3. DB.		meeting이라는 DB를 만들고, meeting에 profile이라는 Table을 	만들도록 하져.	#mysqladmin create meeting	Database "meeting" created.	#mysql meeting	mysql> create table profile(name char(10), sex char(3), age int, hobby tinyint	    -> , job tinyint);	각각의 필드는 다음과 같습니다.	name  : 이름	sex   : 성별	age   : 나이	hobby : 취미 			hobby = 1 : 낚시, 등산, 여행 등			        2 : 컴퓨터, 인터넷, 채팅, 게임					3 : TV, 라디오, 신문 읽기, 음악 듣기					4 : 당구, 술, 춤 	job   : 직업			job   = 1 : 학생					2 : 주부					3 : 공무원					4 : 자영업					5 : 회사원					6 : 연예인	취미와 job을 직접 DB에 집어 넣지 않은 이유는	용량을 줄이고 수정을 쉽게 하기 위해서져. 	tinyint는 1 byte 입니다. 	각자 데이타를 입력해 봅시다.		예)	mysql> insert into profile values ('오모양', '여', 25,1,1);	이런 식으로 계속해서 데이타를 입력하져.	그럼 각자 입력한 데이터를 봅시다.	mysql> select * from profile ;	+--------+------+------+-------+------+	| name   | sex  | age  | hobby | job  |	+--------+------+------+-------+------+	| 오모양 | 여   |   25 |     1 |    1 |	| 허정수 | 남   |   22 |     1 |    2 |	| 박미달 | 여   |   22 |     2 |    3 |	| 조규태 | 남   |   22 |     1 |    3 |	| 김봉길 | 남   |   30 |     2 |    4 |	| 이민규 | 남   |   20 |     4 |    6 |	| 이애경 | 여   |   19 |     3 |    2 |	+--------+------+------+-------+------+	7 rows in set (0.00 sec)	음. 이 정도면 준비는 다 됐으니, 이제 소스 코드를 보면서	설명을 하져...	혹시, 위의 'MySQL C API'에 대한 강좌를 읽지 않으셨다면	꼭 읽어 보셔야 합니다.4. 헤더 파일	char *query[] = { "select * from %s where name = '%s'",				  	  "select * from %s where age >= %d && age <= %d && sex = '%s' "	};	/* query[LN]은 이름 만으로 찾기	   query[LT]은 성별과 나이로 찾기 입니다.	   그냥, 쓰기 편하게....	*/	#define LN 0  	#define LT 1	/* DB에서 읽어온 취미에 관한 값이 2였으면	   hobby[2] = "낚시, 등산, 여행 등" 이니깐	   hobby[2] 를 출력해주면 되겠네여.	*/	char *hobby[] = { NULL, 					  "낚시, 등산, 여행 등",					  "컴퓨터, 인터넷, 채팅, 게임",					  "TV, 라디오, 신문 읽기, 음악 듣기",					  "당구, 술, 춤"	};	char *job[] = { NULL,					"학생",					"주부",					"공무원",					"자영업",					"회사원",					"연예인"	};5. main.c#include #include #include #include "query.h"MYSQL meeting ;MYSQL_RES *result ;MYSQL_ROW row ;void exiterr( void );void connect2db( void ) ;void close2db( void ) ;void ln( void ) ;void lt( void ) ;void divide(int , int *, int *) ;void main(void){	int select ;	connect2db() ;	printf("1. 이름으로 검색\n2. 성별과 나이로 검색\n") ;	printf("선택하세요 : ") ;	scanf("%d", &select) ;	if( select == 1 )		ln() ; /* 이름으로 검색 */	else if( select == 2)		lt() ; /* 성별과 나이로 검색 */	else		printf("잘못 입력하셨습니다.\n") ;	close2db() ;}void ln( void ){	char ln_name[10] ;	char query_buffer[200] ;	int i ;	printf("검색하실 이름을 입력하십시오\n") ;	printf("검색할 이름 : ") ;	scanf("%s", ln_name) ;	sprintf(query_buffer, query[LN], "profile", ln_name) ;	if(mysql_query(&meeting, query_buffer) )		exiterr() ;	if( ! (result = mysql_store_result( &meeting ) ))		exiterr() ;	while( row = mysql_fetch_row( result ) )	{		printf("이름 : %s\n", row[0] ) ;		printf("성별 : %s\n", row[1] ) ;		printf("나이 : %s\n", row[2] ) ;		printf("취미 : %s\n", hobby[ atoi( row[3] )]) ;		printf("직업 : %s\n", job[ atoi( row[4] )]) ;	}}void lt( void ) {	int cnt ;	char query_buffer[300] ;	char sex[3] ;	int low , high , select;		printf("검색할 성별은[남/여] : ") ;	scanf("%s", sex) ;	printf("검색할 나이는?\n") ;	printf("1. 13세 이하\n2. 14~18세\n3. 19~25세\n4. 25세 이상\n") ;	printf("선택 : ") ;	scanf("%d", &select ) ;	getchar() ;	divide(select, &low, &high) ;	sprintf(query_buffer, query[LT], "profile", low, high, sex) ;	if(mysql_query(&meeting, query_buffer) )		exiterr() ;	if( ! (result = mysql_store_result( &meeting ) ))		exiterr() ;	cnt = 0 ;	while( row = mysql_fetch_row( result ) )	{		printf("검색 결과 %d : \n", cnt++) ;		printf("이름 : %s\n", row[0] ) ;		printf("성별 : %s\n", row[1] ) ;		printf("나이 : %s\n", row[2] ) ;		printf("취미 : %s\n", hobby[ atoi( row[3] )]) ;		printf("직업 : %s\n", job[ atoi( row[4] )]) ;				printf("더 보시려면 enter 키를 누르세요") ;		getchar() ;		/* row[i]는 char * 형입니다.  숫자로 바꿔주기 위해서 		   atoi()를 썼습니다.		   query.h를 보면 쉽게 이해될 수 있을 듯		*/	}}void divide(int select , int *low, int *high) {	switch( select )	{		case 1: 			*low = 0 ;			*high = 13 ;			break ;		case 2:			*low = 14 ;			*high = 18 ;			break ;		case 3:			*low = 19 ;			*high = 25 ;			break ;		case 4 :			*low = 26 ;			*high = 99 ;			break ;		default:			*low = 0 ;			*high = 100 ;			break ;	}}void connect2db( void ){	/* host 부분이 NULL이면 localhost입니다. */	if( !mysql_connect(&meeting, NULL, "inos", "hjshjs"))		exiterr() ;	/* meeting이라는 db를 선택 */	if( mysql_select_db(&meeting, "meeting")) 		exiterr() ;}void close2db( void ){	mysql_free_result( result ) ;	mysql_close( &meeting ) ;}void exiterr( void ){	printf("ERROR : %s\n", mysql_error(&meeting)) ;	exit(1) ;}6. 컴파일 방법	컴파일을 하기 위해선 gcc의 옵션 정도는 아셔야 합니다. 	위에 있는 강좌의 처음을 참고하세요.7. 실행 결과	만들어진 실행 파일을 그냥 실행 시켜도 되지만,,,,	그럼 외부에서 접속해서 사용할 수는 없잖아여....	그래서 telnet으로 접속해서 사용하는 방법을 생각해 봤네여.	네트웍 프로그래밍 하기 지겨워서리....	일단 암호없는 계정을 만들고( 1번을 보세여)	계정의 쉘을 우리가 만든 프로그램으로 했습니다.	/etc/passwd 파일에서 쉘 부분을 이 프로그램으로 바꿔주세여....	실행을 해보면 다음과 같습니다.	InoS Linux release 5.1 (AddOn)	Kernel 2.0.35 on an i686	login: inos	Last login: Mon Mar 22 20:10:05 from 192.168.1.2	1. 이름으로 검색	2. 성별과 나이로 검색	선택하세요 : 1	검색하실 이름을 입력하십시오	검색할 이름 : 허정수	이름 : 허정수	성별 : 남	나이 : 22	취미 : 남	직업 : 22	단순히 예제 프로그램이라 많은 일을 하진 않습니다.8. 마침		많은 도움이 되었으면 하는데.....	MySQL에 있는 예제만큼 밖에 안되나 보네여...	근데 조금만 응용하면, 좋은 프로그램 만들 수 	있을 거예여....	질문이 있으시다면	InoS에게 	메일을 보내주세여.	감사합니다
출처 : http://blog.naver.com/cotton7/20006590328

'MySQL' 카테고리의 다른 글

Calling MySQL from C  (0) 2006.11.20
C 와 MySQL 의 연동  (0) 2006.11.20
MySQL C API 로 unicode 데이터 insert 하기  (0) 2006.11.19
MySQL C API 설명  (0) 2006.11.19
MySQL For C API  (0) 2006.11.19
, .

C API 를 사용해서 UNICODE 데이터를 DB에 넣고싶습니다.

DB는 MySQL 4.1.26 이고 디폴트 문자셋을 utf8 로 세팅했습니다.

웹 -> DB -> 웹 으로 utf8 로 된 데이터가 잘 등록되거 읽어지는것을 확인했습니다.

그리고 DB -> App 로 utf8 데이터를 잘 가져와서 콘솔화면에 잘 표시

(가져온 데이터를 utf8 에서 현재 사용하는 콘솔의 문자셋으로 변환) 하는것 까지 해결했습니다.

이제 남은것은 유니코드 데이터를 DB에 저장시키는 것입니다.

전세계 수많은 클라이언트에서 그들만의 문자셋으로 로그가 생성되며 그것을 다시 Unicode 로 변환해서

서버로 전송됩니다.

서버에서는 받은 Unicode 로 된 데이터를 MySQL DB에 기록해야하는데 그 방법을 모르겠습니다.

int queryResult = mysql_query(&mysql, "INSERT INTO unicodetable(name) values('ab한글efg') ");

같은 코드는 제대로 입력도 안됩니다.

그렇다고
int queryResult = mysql_query(&mysql, L"INSERT INTO unicodetable(name) values('ab한글efg') ");
이렇게하면 mysql_query 함수의 인자 타입이 맞지 않습니다.

도저히 답이 안나옵니다. 어떻게 DB에 데이터를 넣을 수 있을까요?

일단 데이터를 무사히 가져오는 부분을 올립니다.

int _tmain(int argc, _TCHAR* argv[])
{
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;

mysql_init(&mysql);

if(!mysql_real_connect(&mysql, "localhost", "user1", "password", "test", 3306, (char*)NULL, 0))
{
//error
return 0;
}

if(mysql_query(&mysql, "set names utf8"))
{
//error
mysql_close(&mysql);
return 0;
}

//int queryResult = mysql_query(&mysql, "INSERT INTO unicodetable(name) values('ab한글efg') ");
int queryResult = mysql_query(&mysql, "select * from unicodetable");

if( queryResult == 0 )
{
//error
}
//query_stat = mysql_query(connection, query);
//if (query_stat != 0)


char buf[256];
res = mysql_store_result(&mysql);
int fields =mysql_field_count(&mysql);
if( res )
{
while((row=mysql_fetch_row(res)))
{
for(int cnt=0;cnt {
UTF8Decode(row[cnt], buf, sizeof(buf));
printf("%s ", buf);
}
printf("\n");
}
}
mysql_free_result(res);

mysql_close(&mysql);
}

'MySQL' 카테고리의 다른 글

C 와 MySQL 의 연동  (0) 2006.11.20
MySQL C-API Example  (0) 2006.11.20
MySQL C API 설명  (0) 2006.11.19
MySQL For C API  (0) 2006.11.19
Mysql C API를 이용한 초간단 회원 관리  (0) 2006.11.19
, .

MySQL C API 설명

MySQL 2006. 11. 19. 03:10

MySQL C API

1) my_ulonglong mysql_affected_rows(MYSQL* mysql)
INSERT, UPDATE, DELETE 등의 query로 영향을 받은 ROW의 수를 리턴한다.

2) void mysql_close(MYSQL* mysql) 서버와의 연결을 종료한다.

3) void mysql_data_seek(MYSQL_RES* result, unsigned int offset)
result에서 임의의 ROW에 접근을 하도록 하는 함수이다. offset이 row의 번호를
나타낸다. 0이면 처음 ROW, mysql_num_rows( result ) - 1 은 마지막 row를 나타낸다.

4) unsigned int mysql_errno(MYSQL* mysql)
가장 최근에 mysql에 일어난 에러의 번호를 리턴한다.

5) char* mysql_error(MYSQL* mysql) 가장 최근에 일어난 에러 메시지를 리턴한다.

6) MYSQL_FIELD* mysql_fetch_field(MYSQL_RES* result)
한번 호출할 때마다 한 나의 필드에 대한 정보를 리턴한다.

7) MYSQL_FIELDS* mysql_fetch_fields(MYSQL_RES* result)
배열 형대로 result의 필드에 대한 정보를 한꺼번에 리턴한다.

8) MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL* mysql, MYSQL_FIELD_OFFSET offset)
임의의 필드에 접근을 하도록 한다.

9) MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES* result)
현재 필드의 offset을 리턴한다.

10) void mysql_free_result(MYSQL_RES* result)
result에 할당된 메모리를 해제한다.

11) MYSQL* mysql_init(MYSQL* mysql)
mysql 객체를 초기화 한다. 인자가 NULL이면 새로운 MYSQL 객체를 생성하고, 초기화 하여 리턴한다.

12) MYSQL_RES* mysql_list_dbs(MYSQL* mysql, const char* wild)
현재 서버에 있는 데이타베이스의 목록을 리턴한다. wild는 MySQL에서
사용할 수 있는 정규식을 나타낸다.
result = mysql_list_dbs( &mysql,"%" )
는 모든 데이타베이스를 리턴하는 예이다.(%는 '모든'을 나타낸다)

13) MYSQL_RES* mysql_list_tables(MYSQL* mysql, const char* wild)
현재 데이타베이스에 있는 테이블들의 목록을 리턴한다.

14) unsigned int mysql_num_fields(MYSQL_RES*result) 혹은
unsigned int mysql_num_fields(MYSQL* mysql)
필드의 수를 리턴한다.

15) my_ulonglong mysql_num_rows(MYSQL_RES* result)
result에 총 몇 개의 ROW가 있는지 리턴한다. query 수행 후
mysql_store_result()를 호출하였을 경우에만 사용할 수 있고,
mysql_use_result()는 사용할 수 없다.

16) int mysql_ping(MYSQL* mysql)
서버에 연결 중인지를 리턴한다. 연결이 끊어 졌을 경우, 다시
연결을 시도한다. 서버와 연결을 한 후 오랫동안 가만히 있으면
서버가 연결을 끊어버리는데, 이런 경우에 사용한다.

17) int mysql_query(MYSQL* mysql, const char* query)
query가 포인트 하는 쿼리를 수행한다. query의 끝은 NULL 문자이다.
성공적으로 query를 수행하였으면 0을 리턴한다.

18) MYSQL* mysql_real_connect(MYSQL* mysql, const char* host, const char* user,
const char* passwd, const char* db, uint port, const char* unix_socket,unit client_flag )
host와의 연결을 시도한다.

19) int mysql_real_query(MYSQL* mysql, const char* query, unsigned int length)
mysql_query()처럼 query를 수행하나, query의 끝이 legnth인 것이 다르다.

20) MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES* result)
현재 ROW의 offset을 리턴한다.

21) int mysql_select_db(MYSQL* mysql, const char* db)
사용하고자 하는 database를 변경한다. mysql_query()를 이용하여 "use db이름"
의 query를 수행해도 같은 결과를 얻는다.

22) int mysql_shutdown(MYSQL* mysql)
서버를 종료시킨다. 현재 사용자에게 shutdown 권한이 있어야 한다.

23) MYSQL_RES* mysql_store_result(MYSQL* mysql)
query의 수행 결과를 서버로부터 한 번에 모두 받아 온다.

24) MYSQL_RES* mysql_use_result(MYSQL* mysql)
query의 수행 결과를 서버로부터 한 개의 ROW 씩 받아 온다.

http://hobak.emailkorea.net/hobak/bbs/zboard.php?id=hGuest&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=name&desc=asc&no=4


'MySQL' 카테고리의 다른 글

MySQL C-API Example  (0) 2006.11.20
MySQL C API 로 unicode 데이터 insert 하기  (0) 2006.11.19
MySQL For C API  (0) 2006.11.19
Mysql C API를 이용한 초간단 회원 관리  (0) 2006.11.19
Mysql Tip  (0) 2006.05.14
, .

MySQL For C API

MySQL 2006. 11. 19. 03:04

간단하게나마 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
, .