mysql-installer-web-community-5.6.22.0.msi

MySQL용 ODBC 드라이버를 설치하지 않고 직접 라이브러리를 이용하는 방법으로 MS Visual C++ 6.0 환경에서 MySQL을 접근하는 방법을 살펴보겠다. 이 방법은 MySQL Database가 어디 있든 상관없이 MySQL서버에 접근 권한 설정만 되어 있으면 상관없겠다.

여기서 제시한 방법은 내가 사용한 방법이지 결코 답은 아니다. 더 좋은 방법이 있다면 함께 공유했으면 한다.
또 환경이 Visual C++ 6.0 이라고 해서 .NET환경에 적용하지 못한다는 법은 없다. 다 참고가 되는 내용이라고 생각한다.

여기서는 Window에 Apache, PHP, MySQL을 자동적으로 설치해주는 WAMP를 설치하고 필요한 개발관련 C Include 파일과 Lib, DLL File를 설정한 다음, 간단한 예제로 설명을 마무리 하겠다.

1. Window 환경에서 APM(Apache, PHP, MySQL) 설치하기


Window환경에 APM을 설치하는 방법은 여러가지가 있다. 그중 가장 쉬운 방법은 이미 나왔는 APM설치관련 패키지를 이용하는 것이 있다. 나는 WAMP라는 훌륭한 APM통합환경을 구축해주는 프로그램으로 쉽게 설치할 수 있었다. 이에 대해서는 아래 링크를 참고하길 바란다.

http://blog.jidolstar.com/77

만약 외부에 MySQL이 있다면 원격에서 접근이 가능한지 확인한 후(mysql DB에 user테이블 host필드가 %로 설정하는 것 같이 외부 접근권한이 설정되어 있어야 한다.) 사용하면 되겠다.

2. C언어 개발관련 Include 파일 및 Lib파일 설치하기


C언어 개발관련 파일을 설치하기 위해 먼저 http://dev.mysql.com/ 에 접속해서 왼쪽메뉴에 Downloads > MySQL Community Server > 5.1(또는 6.0이상) 으로 들어간다. 여기서 Windows downloads에서 Window Essentials(x86)을 직접 Download하던가 Pick a mirror에 들어가서 다운로드 받으면 된다.

다운로드를 받아 실행한다. 다음으로 넘어가면 기본 Typical이 설정되어 있을텐데 Custom으로 바꾼뒤 다음으로 넘어가면 아래와 같은 화면이 나온다.

사용자 삽입 이미지


여기서 C Include Files/Lib Files 만 제외하고 전부 닫아준 다음, 설치를 하면 C:\Program Files\MySQL\MySQL Server 5.1 에 include 폴더와 lib 폴더가 생성된다. include 폴더에는 C언어나 C++에서 사용할 수 있는 MySQL 관련 Header 파일들이 있다. 그리고 lib\opt 폴더 안에는 우리가 사용할 libmysql.lib을 포함한 Lib파일들이 존재하는 것을 확인할 수 있다.

MS Visual C++ 을 실행하고 Tools > Options를 선택하면 아래와 같은 창이 뜬다. Directories 탭을 선택하고 Show directorries for: Include files를 선택한 다음 아래와 같이 Mysql관련 Header 파일이 있는 폴더의 경로를 입력한다. 이런 설정이 필요한 것은 #include <mysql.h> 처럼 <>로 사용할 수 있게 설정하기 위한 것이다. 만약 이렇게 하지 않으면 필요할 때마다 include에 있는 header파일을 전부 복사해서 자신의 프로젝트 폴더에 복사해서 #include "mysql.h" 처럼 사용해야 할 것이다.
사용자 삽입 이미지

그리고 Show directories for:를 Library files를 선택후 Lib가 존재하는 폴더의 경로를 입력하도록 한다.
이 작업을 하지 않으면  프로젝트를 새로 생성해서 작업할때 마다 필요한 lib를 복사해서 사용해야 하므로 아주 번거롭다. Lib파일은 DLL를 로드하고 링크하는 역할을 담당하게 된다.

사용자 삽입 이미지



3. libmysql.dll을 system32폴더에 복사하기


Visual C에서 MySQL을 사용하기 위해 libmysql.dll을 C:\windows\system32 폴더에 있어야 한다.
지금까지 설정만으로는 그렇게 되어 있지 않음을 알 수 있다. DLL 파일은 함수의 집합체라고 할 수 있다. Lib에 의해 로드가 되며 C언어에서는 사용되는 함수의 선언 Header파일로 접근이 가능하겠다.

MySQL의 함수 집합체인 DLL은 libmysql.dll은 앞서 APM을 설치했으므로 C:\wamp\php 폴더에 있다. libmysql.dll을 복사해서 C:\windows\system32 에 복사하면 되겠다.
만약 APM을 설치 안했다면 http://dev.mysql.com 에 접속해서 downloads>connector > Connector/PHP 로 들어가 mysql extention에서 for MySQL Server에 들어가 >>No thanks, just me to the download!를 선택해 다운로드 받아 압축을 풀면 libmysql.dll을 받을 수 있을 것이다.

만약 이 작업을 안한 상태에서 프로젝트 생성후 제작한 MySQL관련 프로그램 실행하면 libmysql.lib이 libmysql.dll을 로드하지 못해서 실행할 수 없다는 에러가 나올 것이다. 이 말은 자신의 프로그램의 결과물인 .exe파일 뿐 아니라 dll도 함께 배포해야한다는 것을 의미하기도 한다.


4. 간단한 예제


이 예제를 실행하기 전에 반드시 MySQL 계정에 자신의 계정 및 접속권한을 확인해야한다.
생각보다 어렵지 않게 실행할 수 있을 것이며

#define SOCKET int 는 맨 위해 #include <mysql.h>는 반드시 다른 include 포다 아래쪽에 있어야 에러를 발생하지 않는다.

#pragma comment()문은 lib를 프로젝트 셋팅할때마다 Project > Setting 에서 link에 libmysql.lib와 ws2_32.lib를 modules에 등록하는 번거로움을 덜기 위해 사용한다.

C코드 예제 (Language : c)
#define SOCKET int

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

#pragma comment(lib, "libmysql.lib")
#pragma comment(lib, "ws2_32.lib")   

#define DB_HOST "호스트 IP, 도메인 또는 localhost"
#define DB_USER "접속 ID"
#define DB_PASS "접속 암호"
#define DB_NAME "DB명"

#define SQL_CREATE_TABLE "CREATE TABLE `mysql_api_test` (\
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,\
    `num` INT NULL ,\
    `string` VARCHAR( 20 ) NULL \
    ) TYPE = MYISAM ;" //"
#define SQL_INSERT_RECORD "INSERT INTO `mysql_api_test` ( `id` , `num` , `string` ) \
    VALUES (\
    NULL , '%d', '%s'\
    );" //"
#define SQL_SELECT_RECORD "SELECT * FROM `mysql_api_test`"
#define SQL_DROP_TABLE "DROP TABLE `mysql_api_test`"

int main()
{
    MYSQL *connection=NULL, conn;
    MYSQL_RES *sql_result;
    MYSQL_ROW sql_row;
    int query_stat;
    int i;

    char query[255];

    mysql_init(&conn);

    // DB 연결
    connection = mysql_real_connect(&conn, DB_HOST,
        DB_USER, DB_PASS,DB_NAME, 3306,(char *)NULL, 0);
    if(connection==NULL)
    {
        fprintf(stderr, "Mysql connection error : %s", mysql_error(&conn));
        return 1;
    }

    // 테이블 생성
    query_stat=mysql_query(connection,SQL_CREATE_TABLE);
    if (query_stat != 0)
    {
        fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
        return 1;
    }

    // 레코드 삽입
    for(i=0;i<5;i++)
    {
        sprintf(query,SQL_INSERT_RECORD,100+i,"안녕하세요 지돌스타예요~");
        query_stat = mysql_query(connection, query);
        if (query_stat != 0)
        {
            fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
            return 1;
        }
    }

    // 셀렉트
    query_stat=mysql_query(connection,SQL_SELECT_RECORD);
    if (query_stat != 0)
    {
        fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
        return 1;
    }

    // 결과 출력
    sql_result=mysql_store_result(connection);
    while((sql_row=mysql_fetch_row(sql_result))!=NULL)
    {
        printf("%2s %2s %s\n",sql_row[0],sql_row[1],sql_row[2]);
    }
    mysql_free_result(sql_result);

    // 테이블 삭제
    query_stat=mysql_query(connection,SQL_DROP_TABLE);
    if (query_stat != 0)
    {
        fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
        return 1;
    }

    // DB 연결 닫기
    mysql_close(connection);
    return 0;
}



참고사이트

MySQL 공식 Development 사이트 : http://dev.mysql.com
MySQL++ : http://tangentsoft.net/mysql++/
MySQL API 사용하기 : http://deadwi.jaram.org/wiki/wikka.php?wakka=KnowingCppMySqlAPI
[그리즐리의 ATL/MFC 팁]MySQL 시작하기 : http://blog.naver.com/hello20/150021875380

글쓴이 : 지돌스타(http://blog.jidolstar.com/250)

'개발지식창고 > DataBase' 카테고리의 다른 글

[SQLITE] SQLITE 관련 사이트  (0) 2013.06.28
[SQLITE] 자료형  (0) 2013.06.28
MySQL : Data Type (1 of 2)  (0) 2010.08.31
MFC MYSQL 연동  (0) 2010.08.31
[MySQL] 기본명령어  (0) 2010.08.31
Posted by 모과이IT
,