우선 처음 사용해보시는 분들을 위해...
사용하시기 위해서는 아래 링크에서 해당 mysql connector API를 설치하시거나,
압축 파일을 받아서 푸시고 경로를 지정하시거나 하나를 선택해서 하시면 됩니다.
https://www.mysql.com/products/connector/
아래에 코드는 멀티 스레드 환경에서 동기화 작업은 고려되지 않았어요 ~_~/
pika_library_mysql_connector.h
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 | 
#ifndef PIKA_LIBRARY_MYSQL_CONNECTOR_H_ 
#define PIKA_LIBRARY_MYSQL_CONNECTOR_H_ 
// # MySqlConnector class 
// DB 사용을 위한 클래스다. 
// 멀티스레드 환경에서 사용에 대한 동기화는 고려되어 있지 않다. 
// [NOTICE] 
// - MySQL 관련 폴더를 프로젝트 속성 추가 인클루드 폴더에 설정해야된다. 
// - time.h 를 사용하는 경우, timesepc 에 대해 redefinition 되었다는 에러가 뜰 수 있다. 
// - mysql - connector - c - 6.1.6 - winx64 버전으로 작업 진행함. 
#include <tchar.h> 
#include "C:\mysql-connector-c-6.1.6-winx64\include\my_global.h" 
#include "C:\mysql-connector-c-6.1.6-winx64\include\mysql.h" 
#include "C:\mysql-connector-c-6.1.6-winx64\include\errmsg.h" 
#pragma comment (lib, "libmysql.lib") 
// 일시적으로 연결 오류 또는 끊어질 수 있는 에러들 
//CR_SOCKET_CREATE_ERROR 
//CR_CONNECTION_ERROR 
//CR_CONN_HOST_ERROR 
//CR_SERVER_GONE_ERROR 
//CR_TCP_CONNECTION 
//CR_SERVER_HANDSHAKE_ERR 
//CR_SERVER_LOST 
//CR_INVALID_CONN_HANDLE 
namespace pika_library 
{ 
    const int kQueryMaxLength = 2048; 
    class MySqlConnector 
    { 
    public: 
        explicit MySqlConnector(char *db_ip, char *user, char *password, char *db_name, int db_port); 
        virtual ~MySqlConnector(); 
        bool        ConnectDB(); 
        bool        DisconnectDB(); 
        bool        Query(WCHAR *QueryFormat, ...); 
        MYSQL_ROW   FetchRow(); 
        void        FreeResult(); 
    private: 
        MYSQL       conn_; 
        MYSQL       *conn_pointer_; 
        MYSQL_RES   *sql_result_pointer_; 
        char    db_ip_[16]; 
        char    db_user_[64]; 
        char    db_pw_[64]; 
        char    db_name_[64]; 
        int     db_port_; 
        bool    connect_flag_; 
        WCHAR   wchar_query_[kQueryMaxLength]; 
        char    char_query_[kQueryMaxLength]; 
        int     last_error_; 
        char    last_error_msg[128]; 
    }; 
} 
#endif | cs | 
pika_library_mysql_connector.cpp
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 | 
#include "pika_library_common_header.h" 
#include "Global.h" 
using namespace pika_library; 
MySqlConnector::MySqlConnector(char *db_ip, char *user, char *password, char *db_name, int db_port){ 
    mysql_init(&conn_); 
    strcpy_s(db_ip_, 16, db_ip); 
    strcpy_s(db_user_, 64, user); 
    strcpy_s(db_pw_, 64, password); 
    strcpy_s(db_name_, 64, db_name); 
    db_port_ = db_port; 
} 
MySqlConnector::~MySqlConnector(){ 
} 
bool        MySqlConnector::ConnectDB(){     
    if (connect_flag_ == true) 
    { 
        DisconnectDB(); 
    } 
    conn_pointer_ = mysql_real_connect(&conn_, db_ip_, db_user_, db_pw_, db_name_, db_port_, NULL, 0); 
    mysql_set_character_set(conn_pointer_, "utf8"); 
    if (conn_pointer_ == NULL)  
    { 
        return false; 
    } 
    else 
    { 
        connect_flag_ = true; 
        return true; 
    } 
} 
bool        MySqlConnector::DisconnectDB(){ 
    mysql_close(conn_pointer_); 
    connect_flag_ = false; 
    return true; 
} 
bool        MySqlConnector::Query(WCHAR *QueryFormat, ...){ 
    va_list args; 
    va_start(args, QueryFormat); 
    _vstprintf_s(wchar_query_, kQueryMaxLength, QueryFormat, args); 
    int result = WideCharToMultiByte(CP_UTF8, 0, wchar_query_, static_cast<int>(wcslen(wchar_query_)), char_query_, kQueryMaxLength, NULL, NULL); 
    if (result < kQueryMaxLength) 
    { 
        char_query_[result] = '\0'; 
    } 
    while (TRUE) { 
        int queryResult = mysql_query(conn_pointer_, char_query_); 
        if (queryResult != 0) 
        { 
            // Query Error. 
            // 현재는 화면에 출력하지만, 로그 파일에 따로 에러난 쿼리를 저장하는게 좋다. 
            unsigned int error_code = mysql_errno(conn_pointer_); 
            //printf("MySQL query error(%d): %s", error_code, mysql_error(conn_pointer_)); 
            gLogManager->Log(L"QUERY", SystemLog::kErrorLevel, L"MySql Query Error(%d) / Query: %s \n", error_code, wchar_query_); 
            //CR_SOCKET_CREATE_ERROR 
            //CR_CONNECTION_ERROR 
            //CR_CONN_HOST_ERROR 
            //CR_SERVER_GONE_ERROR 
            //CR_TCP_CONNECTION 
            //CR_SERVER_HANDSHAKE_ERR 
            //CR_SERVER_LOST 
            //CR_INVALID_CONN_HANDLE 
            if (error_code == CR_SOCKET_CREATE_ERROR || error_code == CR_CONNECTION_ERROR || error_code == CR_CONN_HOST_ERROR || 
                error_code == CR_SERVER_GONE_ERROR || error_code == CR_TCP_CONNECTION || error_code == CR_SERVER_HANDSHAKE_ERR || 
                error_code == CR_SERVER_LOST || error_code == CR_INVALID_CONN_HANDLE) { 
                if (ConnectDB() == false) { 
                    gLogManager->Log(L"QUERY", SystemLog::kErrorLevel, L"MySql Connect False. \n"); 
                    Sleep(10); 
                } 
            }else{ 
                return false; 
            } 
        } 
        else  
        { 
            break; 
        } 
    } 
    sql_result_pointer_ = mysql_store_result(conn_pointer_); 
    return true; 
} 
MYSQL_ROW   MySqlConnector::FetchRow(){ 
    return mysql_fetch_row(sql_result_pointer_); 
} 
void        MySqlConnector::FreeResult(){ 
    mysql_free_result(sql_result_pointer_); 
} | cs | 
 
댓글 없음:
댓글 쓰기