우선 처음 사용해보시는 분들을 위해...
사용하시기 위해서는 아래 링크에서 해당 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 |
댓글 없음:
댓글 쓰기