태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
밤하늘의 실제별, 나도 가질 수 있다?!

MS Visual C++ 6.0 환경에서 MySQL 연동하는 방법

2007/10/17 11:11

 

[공지]이미지나 링크가 깨졌다면 댓글 부탁드립니다.

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)
크리에이티브 커먼즈 라이선스
Creative Commons License

개발/Database , , , , ,

Trackback 주소: http://blog.jidolstar.com/trackback/250
  1. Blog Icon
    안녕하세요.

    인터넷 호스팅사이트의 phpmyadmain으로 생성한 MySql서버에 접속하려고하니
    Mysql connection error : Acces denied for user: 'id@localhost' (Using password: YES)Press any key to continue
    라는 에러가 납니다..
    인터넷사이트를 검색해보니 권한설정을 잘못하면 그럴수있다고하던데 phpmyadmain에 접속할수있다는것 자체가 id <-로서 접근권한이 있다는뜻이 아닌가요? db에 아예 db의 권한설정하는 부분이 없던데요.. 이것은 호스팅사이트에서 부여해준 id pass로서 권한이 설정되어있다는 의미가 아닐까요? 정말 고민입니다..

    #define DB_HOST "localhost"
    #define DB_USER "Id"
    #define DB_PASS "password"
    #define DB_NAME "db_name"

    // 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;
    }

    한수 가르침을 주신다면 감사드리겠습니다.

  2. 본 김에 제가 간단하게 덧글 남깁니다.

    #define DB_HOST "localhost"
    #define DB_USER "사용자 실제 ID"
    #define DB_PASS "사용자의 실제 비밀번호"
    #define DB_NAME "사용자가 사용할 수 있는 DB이름"

    이렇게 설정하셔야 맞습니다.
    호스팅을 받으신다면 권한이 주어진 ID를 지급받으셨을겁니다. 그런 것들은 안내하고 있고요. 그 안내에 맞게 설정파일을 수정하셔서 phpmyadmin 을 실행하셔야됩니다.
    phpmyadmin 자체는 php로 이루어진 것이니 php를 지원하는 호스팅에서 실행은 당연히 됩니다만, 설정이 잘못되어 있다면 mysql과 접속이 이루어지지 않겠죠.
    phpmyadmin의 설정파일 수정에 관련해서는 검색을 하시면 무수히 많은 자료들이 나오니 참고하시기 바랍니다. (버전업 되면서 어떻게 바뀌였는지는 잘 모르겠네요. 안쓴지 벌써 1년... ^^; )
    mysql의 관리자는 mysql에서 사용자 생성 및 권한 설정을 할 수 있습니다. user db에 그런 것들이 등록이 됩니다만, 실제 mysql을 설치하신 것이 아니고 호스팅 받으신다고 하셨으니 여기서 언급할 필요는 없을 것 같구요. 자세한 것은 레퍼런스 참고하시면 되겠구요.

  3. Blog Icon
    안녕하세요.

    phpadmin에서의 접속을 의미하는것인가요? phpadmin에서 테이블생성과 삭제, 수정 등등은 문제없이 됩니다만, 제가말했던 db의 권한설정이 없다는것을 풀어보면 데이터베이스 자체는 호스팅사에서 지정해준 제 아이디값으로 단 하나의 db가 만들어져있었고, 그것을 이용하여 현재 콘솔 프로젝트에서 접근하려할때 해당phpadmin의 id및 phpadmin passwrd로 접속할때 에러메세지가 오는것입니다. 이미권한이 부여됬기때문에 phpadmin접속이 되고 그속에서 테이블을 만들고, 속성을 설정하고.. 등등이 가능한것 아닐가요.;; 문제는 콘솔에서의 db접근이 불가능한것인데, ㅜㅜ.,, 무었이잘못되었는지 모르겠습니다.. 바쁘게 해드려서죄송합니다.

  4. 그 문제라면 호스팅 업체에 알아보심이 더 빠를 듯 싶습니다. 문제점을 이야기 하시고 db 각종 설정을 다시 한번 확인해달라고 요청하세요.

  5. Blog Icon
    안녕하세요.

    답변주신분들 모두 감사드립니다.. ^^;; 다른업체에 해보니되네요. 한가지배웠습니다.

  6. Blog Icon
    힐끔

    옮겨갑니다..

  7. 출처만 넣어주세요. ^^

  8. Blog Icon
    박정수

    잘 정리되어 있는 거 같아서 블로그에 옮겨놓겠습니다.
    혹시, 원치 않으시면, 메일 주세요.
    바로 삭제 하겠습니다.
    standalon at 한메일

  9. 출처만 넣어주세요. ^^

  10. Blog Icon
    벙끗

    지돌스타님
    db련결까지는 되는데 테이블창조시 돌림값이 1 이 되네요
    원인이 무엇인지 잘 갈쳐주세요

  11. DB에 관련된 설정을 변경해보시면 어떨까요? 가령 테이블 만들 수 있는 권한이 있는지 확인해보시라는 겁니다. ^^
    중국분이신가봐요? ^^

  12. Blog Icon
    벙끗

    지돌스타님.
    c를 이용하여 MySQL과의 연동을 알기쉽게 보여준 좋은 글입니다.
    제가 mysql에 초보라서 우의 실례대로 따라하니 잘 안돼는군요...

    DB연결까지는 되는데 테이불생성에서 query_stat가 1이 나와요.
    테이불을 미리생성하고 레코드추가했는데도 query_stat가 또 1이 나와요.

    우의 코드들에서 어떤 경우에 query_stat가 1이 되는지?

    귀중한 경험 부탁드려요.

  13. 1이 되는 경우는 해당 mysql 라이브러리에 대한 문서를 보심이 어떨까요? 그 문서에 답이 있을겁니다. 일단 0이 되야만 query가 성공하고 나머지 경우에는 실패하는 경우입니다. 실패하는 이유에는 여러가지가 있겠지요. DB연결은 되는가? DB의 테이블 생성 권한이 있는가 등입니다. mysql db 설정을 다시 보세요. 분명 그런 부분에 문제가 있을겁니다.