학습자료(~2017)/C,C++

[MYSQL] 간단 사용법 예제코드

단세포소년 2012. 8. 20. 20:58
반응형

참고 : 

http://zetcode.com/tutorials/mysqlcapitutorial/ 영어 예제
http://koronaii.tistory.com/194 한글 예제
http://dev.mysql.com/doc/refman/5.6/en/c.html  공식 사이트 영어 API 메뉴얼

mysql client library 설치 (centos 6.2 64bit)

 yum install mysql-libs
 yum install mysql-devel

 GCC 옵션 (centos 6.2 64bit)

 gcc -lmysqlclient -L/usr/lib64/mysql -I/usr/include/mysql


 MYSQL 연결 (에러처리 따윈 없다.)

순서 :  
  1.mysql_init()
  2.mysql_real_connect()
  3.mysql_close()

#include<mysql.h>
#include<stdlib.h>

int main()
{
    MYSQL mysql;
    mysql_init(&mysql); //mysql 초기화
    mysql_real_connect(&mysql, NULL, user, passwd , NULL, NULL ,0 );
   // mysql_real_connect(&mysql, host, user, passwd, dbname, unix_socket, unit client_flag);

    mysql_query(&mysql,"create database test"); //test 란 데이터베이스 생성
   
    mysql_close(&mysql);
}

 host : database server 가 실행되고 있는 IP, HOSTNAME. NULL 이면 localhost
 user : 접근 가능한 유저아이디
 passwd : 비밀번호
 dbname : 사용하고 싶은 데이터베이스 이름(use database 와 동일). NULL 이면 최상위
 unix_socket : API 문서 확인해라.
 client_flag : API 문서 확인해라.


 select 해보기

 순서 :
  1.mysql_init()
  2.mysql_real_connect()
  3.mysql_query()
  4.mysql_num_fields()
  5.mysql_fetch_row()
  6.mysql_free_result()
  7.mysql_close()

 #include<mysql.h>
 #include<stdio.h>
 #include<stdlib.h>


int main()
{
    MYSQL mysql;
    MYSQL_RES *res;
    MYSQL_ROW row;
    int fields;
    int i;

    mysql_init(&mysql); //mysql 초기화
    mysql_real_connect(&mysql, NULL, user, passwd , NULL, NULL ,0 );
   // mysql_real_connect(&mysql, host, user, passwd, dbname, unix_socket, unit client_flag);

    mysql_query(&mysql,"use test"); //test 란 데이터베이스 사용 //mysql_select_db() 도 같은 역활

    mysql_query(&mysql,"SELECT * FROM table"); // table 이란 테이블의 모든 레코드 선택

    res=mysql_store_result(&mysql);  // 모든 출력 결과를 서버에서 한번에 다 받아옴(데이터 많을때는 자제하라)

    fields = mysql_num_fields(res); // 필드 갯수 구함

    while(row = mysql_fetch_row(res)) // 한 행을 구함
    {                                             
       for(i = 0; i< fields ; i++)  // 모든 필드 값을 출력
       {
            printf("%s",row[i]);
       }
    }
    
    mysql_free_result(res);
    mysql_close(&mysql);
}

 mysql_store_result() 와 mysql_fetch_row() 만 잘 쓰면된다.

 mysql_query() 에서 출력 결과가 있다면 mysql_fetch_row() 를 사용하면 되고 insert 나 create , delete 같은 경우는    mysql_query()의 반환값만 확인하면 된다.


 mysql error 처리법 

 mysql_error() , mysql_errno() 활용

 #include<mysql.h>

#include<stdlib.h>

int main()
{
    MYSQL mysql;
    mysql_init(&mysql); //mysql 초기화
    mysql_real_connect(&mysql, NULL, user, passwd , NULL, NULL ,0 );
   // mysql_real_connect(&mysql, host, user, passwd, dbname, unix_socket, unit client_flag);

    if(mysql_query(&mysql,"create database test") <0) // 반환이 0보다 작다면 에러 발생
   {
       printf("errno = %u\n",mysql_errno(&mysql)); // mysql errno 출력
       printf("error message = %s\n",mysql_error(&mysql)); //mysql error 메세지 출력
   }
    mysql_close(&mysql);
}

 리눅스의 perror() , errno 와 사용법이 같다.



 Multiple statements (다수 sql)

 
#include<mysql.h>

#include<stdlib.h>

int main()
{
    MYSQL mysql;
    MYSQL_RES *res;
    MYSQL_ROW row;
    int fields;
    int i; 
    mysql_init(&mysql); //mysql 초기화
    mysql_real_connect(&mysql, NULL, user, passwd , NULL, NULL ,0 );
   // mysql_real_connect(&mysql, host, user, passwd, dbname, unix_socket, unit client_flag);

   mysql_query(&mysql, "DROP TABLE IF EXISTS test_table;\
                                  CREATE TABLE test_table(id INT)");\
                                   INSERT INTO test_table VALUES(10);\
                                  UPDATE test_table SET id=20 WHERE id=10;\
                                   SELECT * FROM test_table;\
                                  DROP TABLE test_table");

    do {
           res = mysql_store_result(&mysql);
           if(result)
           {
               process_result_set(&mysql, res);
               mysql_free_result(res);
           }else{
               if(mysql_field_count(&mysql)==0)  // 필드 갯수
               {
                  printf("%lld rows affected\n", mysql_affected_rows(&mysql)); // 바뀐 row 숫자 출력
               }else{
               {  printf("could not retrieve result set\n");
                  break;
               }
           }

    }while(mysql_next_result(&mysql)==0);  // 명시적으로 하나의 statements 실행시킨다.

    mysql_close(&mysql);
}


 다수의 sql 문을 실행시키는 것이다.



 Transaction (트랜잭션)

우선사항 : mysql 이 transaction 을 지원하는 엔진을 가지고 있어야하며 작업하는 테이블의 타입이 transaction을 지원하는 타입이어야한다. transaction을 지원하는 엔진으로는 innoDB가 있다. 설정법은 아래를 참고하라.
http://wiz.pe.kr/444 
http://aladdin07.blog.me/150137323714 


방법 1.만약 다수의 sql문이 하나의 트랜잭션이라면 (transaction 은 검색해보도록) sql 문 실행전에 START TRANSACTION 을 호출하고 트랜잭션이 완벽히 수행되면 COMMIT , 트랜잭션의 요소중 하나라도 실행되지 않았다면 ROLLBACK을 호출하면 좋다.

방법 2. autocommit 옵션을 끄고 mysql_query() 후에 수행이 완벽하면 mysql_commit() 호출하여 저장 하면되고 수행이 완벽하지 않으면 mysql_rollback() 호출하여 복구하면 된다. 

방법 3. mysql_query("BEGIN") 후에 실행시킬 sql문을 수행후 수행이 완벽하면 mysql_query("COMMIT") 수행이 완벽하지 못하면 mysql_query("ROLLBACK") 하면된다.

참고 : http://www.yolinux.com/TUTORIALS/MySQL-InnoDb-Transactions-ForeignKeys.html
http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqltransaction.html
http://dev.mysql.com/doc/refman/5.1/en/commit.html



에러 처리도 없고 아주 간단한 예제를 보였다. 대충 느낌이 왔으면 다른 예제나 메뉴얼보면 아주 간단히 사용할수 있을 것이다.

고급스러운 사용을 위해서는 옵션 설정 API 나 flag 값을 활용해보도록 해라.

반응형