설치 파일은

http://dev.mysql.com/downloads/mysql/6.0.html 

 설치법은
http://blog.naver.com/infopub/100052196232
여기 블로그를 참고..

 현재 6.0 alpha 버젼이 나와서 그걸 설치 했습니다..

 mysql 은... 무료버젼의 db 동접은 기본 100 ~ 500 정도 이지만.. (manual setting 으로 바꿀 수 있지만..) 여튼...
상용화 아닌 이상 그런 큰건 필요 없고, 어차피 sql 문법만 통하면 되는거니
상관없다고 봅니다...

(MS-SQL은 뭔가 C#이니 .asp 니... 쩝...귀찮 ㅡ_ㅡ.. )

 설치시, mysql 설치 유형에서 custom 으로 해서 include, lib 파일 모두 설치 할 수 있도록 해야 프로그래밍 하기 편합니다.

Visual Studio 셋팅은.. DirectX 하던식
Include, Lib 디렉토리 설정해 주면 됩니다...

리눅스에서 vi 를 쓸때.. make 파일 만들어서...

cc -c db.c -I/usr/include/mysql -lmysqlclient 와 같이 해줘야 하는거랑 같은 작업이죠

 기본 API 는

 /////////////////////////////////////////////////////////////////////////////////////

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

MYSQL mysql; // 자료형? 선언

void qur(char *a)
{
 if(mysql_query(&mysql, a)==0)
  printf("%15s 가 전달되었습니다\n",a);
 else
  printf("쿼리 전송 에러\n");
}


void prin()
{
 MYSQL_RES* res ;
 MYSQL_ROW row ;
 int fields;
 res = mysql_store_result( &mysql ) ;
 if(res!=0)
 {
  fields = mysql_num_fields(res) ;
  while(row = mysql_fetch_row( res ))
  {
   printf("%s \n", row[0]) ;
  }
 }
}
void main(void)
{
 
 mysql_init(&mysql) ;
 if(!mysql_real_connect(&mysql, "localhost",       // DB PC, IP
                                               "root",               // DB ID
                                               "1234",              // DB pw
                                                NULL ,  
                                                3306,                // DB Port
                                                (char *)NULL, 0))
   exit(1);
 else
  printf("연결되었습니다.\n") ;
 char qurey[1000]="show databases";
 qur(qurey);
 prin();
 qur("use rosagigantea");
 qur("show tables");
 prin();

 mysql_close(&mysql);
}

///////////////////////////////////////////////////////////////////////////////////////

위의 소스를 main.c (cpp 도 상관없고) 로 copy 해서 alt+f8 로 정렬한뒤
libmysql.lib mysqlclient.lib 를 선언해 주고 (그 winmm.lib 나.. ws2_32.lib 같은곳에)
컴파일 해보고 libmysql.dll 파일 없다고 하면...

을 다운해서

성공하면... root의 database 모든 목록이 출력됩니다.
(물론 이전에 rosagigantea 라는 db를 미리 만들어 놨습니다 ;;)

중요한건.. 역시..

mysql_real_connect(&mysql, "localhost", "root","1234", NULL,3306, (char *)NULL, 0))
이 함수 겠죠..
뜻은, mysql 쿼리를 생성한다, localhost(즉 이 컴퓨터), id는 root, 암호는 1234, 기본DB 없고, port는 3306 이란 뜻입니다.

최종적으로 성공한 화면입니다..


  보면 show databases 로 모든 db를 표시해주고

use rosagigantea (이전에 create database rosagigantea 로 db를 생성했습니다) 로 rosagigantea 라는 db를 사용하고

show tables 로 안에 있는 모든 테이블을 보여주는걸로 끝납니다.

이걸... 모듈화 해서 서버 프로그램에서 이리저리 짓거리 하는게 핵심이죠..

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

MYSQL mysql;

// 쿼리 질의를 한다
void sql_qur(char *sql_query)
{
     printf("input sql query is %s\n", sql_query);
     if( mysql_real_query(&mysql, sql_query, strlen(sql_query)) )
     {
          perror( mysql_error(&mysql) );
          exit( 1 );
     }
}

// 쿼리 질의로 온 결과를 모두 출력한다.
void sql_print_result(char *result)
{
     MYSQL_RES *res;
     MYSQL_ROW row;
     MYSQL_FIELD *fld;
     int fields;

     if( !(res=mysql_store_result(&mysql)) )
     {
          perror( mysql_error(&mysql) );
          exit( 1 );
     }
 
     sprintf(result, "");

     while( (row=mysql_fetch_row(res)) )
     {
          int     i;
     
          for( i=0 ; i<mysql_num_fields(res) ; i++ )
          {
              fld = mysql_fetch_field_direct( res, i );

              if(i == 0)
                  sprintf( result, "%s%20s: %s", result, fld->name, row[i] );
              else
                  sprintf( result, "%s\n%20s: %s", result, fld->name, row[i] );

              if( !strlen(row[i]) )
              {
                  mysql_free_result(res);
                  mysql_close(&mysql);
                  exit(0);
              }
          }
          sprintf( result, "%s\n\n", result );
      }

      mysql_free_result(res);
}

// 쿼리를 받음 단, 한줄에 한개의 쿼리가 찍힌다
void sql_get_result(char *result)
{
        MYSQL_RES *res;
        MYSQL_ROW row;
        int line = 0;
 
        if( !(res=mysql_store_result(&mysql)) )
        {
                perror( mysql_error(&mysql) );
                exit( 1 );
        }
 
        sprintf(result, "");
 
        while( (row=mysql_fetch_row(res)) )
        {
                int     i;
 
                for( i=0 ; i<mysql_num_fields(res) ; i++ )
                {
                        if(i == 0 && line == 0)
                               sprintf( result, "%s", row[i] );
                        else
                               sprintf( result, "%s\n%s", result, row[i] );
 
                        if( !strlen(row[i]))
                        {
                                mysql_free_result(res);
                                mysql_close(&mysql);
                                exit(0);
                         }
                 }
                ++line;
        }
        result[strlen(result)] = '\0';
        mysql_free_result(res);
}

void main(void)
{
        char input_query[100];
        mysql_init( &mysql );

        if( !mysql_real_connect(&mysql,
           "localhost",            // host
           "user",          // user
           "pw",       // passwd
           "db_name",          // db
           3306,                   // port
           NULL,
           0) )
        {
         perror( mysql_error(&mysql) );
         exit( 1 );
        }

        // user 테이블을 출력한다.
        sql_qur("select * from user;");
        sql_print_result(&input_query);
        printf("sql result %s\n", input_query);
 
        // test01 ID에 대한 password 값을 구한다.
        sql_qur("select password from user where ID='test01';");
        sql_get_result(&input_query);
        printf("sql result %s\n", input_query);
 
        // 질의를 입력 받아서 그 결과를 계속 출력
        while(1)
        {
                printf("input sql query! : ");
                sql_qur(gets(input_query));

                sql_get_result(&input_query);
                printf("\nsql result %s\n", input_query);
        }

        mysql_close(&mysql);
}


 출처 카페 > 세은파파의 프로그래밍 하자 .. | 세은파파
원문 http://cafe.naver.com/cyberzone/172
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 씩 받아 온다.
   


간단한 예   
   
***********************************************************
1: #include <stdio.h>
2: #include <mysql.h>
3: #include <errno.h>
4:
5: void main(void)
6: {
7: MYSQL mysql ;
8: MYSQL_RES* res ;
9: MYSQL_ROW row ;
10: int fields ;
11:
12: mysql_init(&mysql) ;
13:
14: if(!mysql_real_connect(&mysql, NULL, "사용자","암호", "test" ,3306, (char *)NULL, 0))
15: {
16:     printf("%s\n",mysql_error(&mysql));
17:     exit(1) ;
18: }
19:
20: if(mysql_query(&mysql, "USE super") )
     // mysql_query()는 query 수행시에 에러가 나게 되면
     // 0이 아닌 값을 리턴한다.
     {
          printf("%s\n", mysql_error(&mysql) ;
          exit(1) ;
     }
21: if(mysql_query(&mysql, "SELECT * FROM dome") )
     {
          printf("%s\n", mysql_error(&mysql) ;
          exit(1) ;
     }
22:
23: res = mysql_store_result( &mysql ) ;
24: fields = mysql_num_fields(res) ;
25:
26: while( ( row = mysql_fetch_row( res ) ))
27: {
28:      for( cnt = 0 ; cnt < fields ; ++cnt)
29:      printf("%12s ", row[cnt]) ;
30:
31:      printf("\n") ;
32: }
33:
34: mysql_free_result( res ) ;
35: mysql_close(&mysql) ;
36: }

*****************************************************
출처 |
원문 http://blog.naver.com/babygom/40014020439

1. Mysql 다운로드& 설치
   http://dev.mysql.com/downloads/ 으로 가서 윈도우용 버전으로 다운을 받고 설치

2. Visual Studio에서 Include, Lib 폴더 설정
    Tools -> option -> directory 에 헤더파일 / 라이브러리 폴더 설정
     헤더 파일 폴더는 Mysql설치된폴더Include
     라이브러리 파일 폴더는 Mysql설치된폴더LibDebug
                                      Mysql설치된폴더LibOpt

3. 프로젝트 셋팅
   위 상태에서 Mysql C API 를 쓰면 컴파일 에러가 발생한다.
   소켓 lib 가 설정되지 않았기 때문이다.
   project --> settings --> [link] 에 ws2_32.lib 추가.
 
   이 상태에서는 컴파일까지는 되지만, 링킹 과정에서 unresolved external symbol 가 발생한다.
   project --> settings --> [link] 에 libmySQL.lib 추가.

4. 지정된 경로에 libmySQL.DLL 파일이 없다는 에러가 발생할시에는..
   Mysql 의 lib 폴더에서 libmySQL.DLL파일을 프로젝트 폴더로 복사한다.


출처: http://www.codedream.net/blog/?no=45

+ Recent posts