728x90
300x250

[MFC] Visual C++ 2019(C++ MFC)에서 Maria DB 연동하기

마리아 DB를 Visual C++ 2019(C++ MFC)에서 사용하는 방법을 소개하겠습니다.

 

1단계: 프로젝트 생성하기

Visual Studio 2019를 켭니다.

 

"새 프로젝트 만들기"를 클릭합니다.

 

 

"MFC 앱"을 클릭합니다.

 

프로젝트 이름을 정한 후 다음을 누릅니다.

이번 예제에서는 "대화 상자 기반"으로 하였습니다.
"대화 상자 기반"을 클릭합니다.

"다음"을 누릅니다.

 

주 프레임 스타일의 체크를 "해제"합니다.

"다음"을 클릭합니다.

"인쇄 및 인쇄 미리 보기(P)", "ActiveX 컨트롤(R)"을 체크 해제합니다.

"다음"을 클릭합니다.

생성된 클래스의 이름 등을 확인하고 "마침"을 클릭합니다.

 

 

2단계: Maria DB Connector(MySQL Connector)

DB 사용 방법은 MySQL과 Maria DB는 동일하나 Connector 등에서 일부 이름이 변경되었습니다.


(MySQL Connectors)
https://dev.mysql.com/downloads/connector/

 

MySQL :: MySQL Connectors

MySQL Connectors MySQL offers standard database driver connectivity for using MySQL with applications and tools that are compatible with industry standards ODBC and JDBC. Any system that works with ODBC or JDBC can use MySQL. Standardized database driver f

dev.mysql.com

(Maria Connectors)
https://downloads.mariadb.org/

 

Downloads - MariaDB

 

downloads.mariadb.org

3단계: libmariadb.dll 문제

(아래 파일로 작업을 하시는 분들은 64bit로 디버그, 릴리즈하셔야 합니다.
MariaDB 10.4 64bit 버전에서 추출하였습니다.)

lib-mariadb-10.4.7z
2.52MB


4단계: 프로젝트 속성 변경

MariaDB-Connector를 소스 코드 버전으로 다운받은 경우입니다.

C/C++의 경로 설정할 때 변경해주시면 되겠습니다.

예: c:\....\mariadb-connector-c-3.1.2-src\mariadb-connector-c-3.1.2-src\include

 

"프로젝트 속성 창"을 띄우는 방법은 다음과 같습니다.

아래처럼 설정해줍니다.
첫 번째
"VC++ 디렉터리->" 라이브러리 디렉터리 : C:\................\MariaDB XX.X\lib

 

두 번째

"C/C++->추가 포함 디렉터리": C:\................\MariaDB XX.X\include\mysql

또는 c:\....\mariadb-connector-c-3.1.2-src\mariadb-connector-c-3.1.2-src\include
(MySQL 사용자는 mysql-connector.....로 찾아서 할 것)

 

세 번째

"링커->추가 종속성" libmariadb.lib로 설정해주기

(MySQL 사용자는 libmysql.lib로 할 것)

5단계: libmysql.dll 또는 libmariadb.dll 프로젝트에 추가해주기


아래의 그림처럼 libmariadb.dll 또는 libmysql.dll을 추가해줍니다. 참조성 오류를 예방할 수 있습니다.



6단계: 사용자 인터페이스 구현

이쁘게 그려줍니다.

(리스트 박스, 텍스트 박스, 버튼, 그룹 박스)를 사용하였습니다.

"아이디", "이름", "생년월일", "리스트박스"의 "변수"를 지정하였습니다.

변수 지정을 잊어버린 분들을 위해서 아래 그림을 보면 생각이 나게 될 것입니다.

변수는 아래처럼 선택하고 입력하면 되겠습니다.
이름(N)은 "m_txtId"로 하였습니다.
범주(T)는 "값"으로 선택하였습니다.

최대 문자는 적절하게 조절하시면 되겠습니다.

ID 변수명 비고
IDC_TxtID m_TxtId  
IDC_TxtName m_TxtName  
IDC_IDC_DATETIMEPICKER m_txtBirthDate  
IDC_LST_Dataview   Report로 속성 변경하였음.


7단계:

소스 코드는 아래처럼 사용하면 적절할 거 같습니다.

MFCApplication1Dlg.cpp

BOOL CMFCApplication1Dlg::OnInitDialog()
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// m_lst_dataview
m_lst_dataview.InsertColumn(0, _T("번호"), NULL, 50);
m_lst_dataview.InsertColumn(1, _T("이름"), NULL, 150);
m_lst_dataview.InsertColumn(2, _T("생년월일"), NULL, 20);

// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
//  프레임워크가 이 작업을 자동으로 수행합니다.
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.

// TODO: 여기에 추가 초기화 작업을 추가합니다.

return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
void CMFCApplication1Dlg::OnBnClickedBtnSubmit()
void CMFCApplication1Dlg::OnBnClickedBtnSubmit()
{
CString strTxt = CString(_T("안녕하세요"));
MessageBoxW( (LPCTSTR) strTxt );

UpdateData(TRUE); // 필드 값 최신화
MessageBox((LPCTSTR)m_txtId, _T("알림(Alert)"), MB_ICONINFORMATION);
}
void CMFCApplication1Dlg::OnBnClickedBtnDataload()
void CMFCApplication1Dlg::OnBnClickedBtnDataload()
{

LVITEM firstitem;

char* host = "hostName";
char* userId = "userID";
char* passwd = "passwd";
char* dbName = "dbName";
int port = 3306;

/* MariaDB(MySQL 연동) */
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;

mysql_init(&mysql);
if (mysql_real_connect(&mysql, host, userId, passwd, dbName, port, NULL, 0) == NULL)
{
return;
}
else {
mysql_query(&mysql, "set names euckr"); // 한글 깨짐 보완
}

char* szQuery = "select * from member";

if (mysql_query(&mysql, szQuery)) {
return;
}

if ((res = mysql_store_result(&mysql)) == NULL) {
return;
}

row = mysql_fetch_row(res);

while (row)
{
std::string name = row[1];
std::string type = row[2];

CString tmp;
tmp = name.c_str();

firstitem = { 0 };

firstitem.mask = LVIF_TEXT;
firstitem.iItem = 0;

// 데이터 삽입 - Firstitem
m_lst_dataview.InsertItem(&firstitem);

// 데이터 값 넣기 - Firstitem
m_lst_dataview.SetItemText(0, 0, _T("1번"));
m_lst_dataview.SetItemText(0, 1, tmp);
m_lst_dataview.SetItemText(0, 2, _T("도도1-2"));

row = mysql_fetch_row(res);
}

mysql_free_result(res);

mysql_close(&mysql);

}
void CMFCApplication1Dlg::OnBnClickedBtnDatainsert()
void CMFCApplication1Dlg::OnBnClickedBtnDatainsert()
{
LVITEM firstitem;

char* host = "hostName";
char* userId = "userID";
char* passwd = "passwd";
char* dbName = "dbName";
int port = 3306;

/* MariaDB(MySQL 연동) */
MYSQL mysql;
MYSQL_RES* res;
MYSQL_ROW row;

UpdateData(TRUE); // 필드 값 최신화

mysql_init(&mysql);
if (mysql_real_connect(&mysql, host, userId, passwd, dbName, port, NULL, 0) == NULL)
{
return;
}
else {
mysql_query(&mysql, "set names euckr"); // 한글 깨짐 보완
}

const int KO_KR_MAX_SIZE = 128; // 한글 지원(여유공간)
CString csTemp = (LPCTSTR)m_txtId;
char* strName = new char[(strlen(CT2A(csTemp)) + 1) + KO_KR_MAX_SIZE];
strcpy_s(strName, sizeof(strName) + KO_KR_MAX_SIZE, CT2A(csTemp));

CTime cTime = m_txtBirthDate.GetYear();

csTemp.Empty();
csTemp.Format(_T("%04d-%02d-%02d %d:%d:%d"), m_txtBirthDate.GetYear(),
m_txtBirthDate.GetMonth(),
m_txtBirthDate.GetDay(),
m_txtBirthDate.GetHour(),
m_txtBirthDate.GetMinute(),
m_txtBirthDate.GetSecond());


char* strBirthDate = new char[(strlen(CT2A(csTemp)) + 1) + KO_KR_MAX_SIZE];
strcpy_s(strBirthDate, sizeof(strBirthDate) + KO_KR_MAX_SIZE, CT2A(csTemp));

char szQuery[256 + KO_KR_MAX_SIZE];
int len = sprintf_s(szQuery, sizeof(szQuery), "insert into member(name, birthdate) values('%s', '%s')", strName, strBirthDate);

if (mysql_query(&mysql, szQuery)) {
return;
}

int check = _CrtDumpMemoryLeaks();

mysql_close(&mysql);

}



* 참고(Reference):

1. CWnd::MessageBox | Microsoft Docs, https://docs.microsoft.com/en-us/previous-versions/0eebkf6f(v=vs.140) Last Modified 2019-07-23, Accessed by 2019-07-23
2. CWnd 클래스 | Microsoft Docs, https://docs.microsoft.com/ko-kr/cpp/mfc/reference/cwnd-class?view=vs-2019#messagebox Last Modified 2019-07-23, Accessed by 2019-07-23
3. MariaDB Connector/C - MariaDB, https://downloads.mariadb.org/connector-c/, Last Modified 2019-07-23, Accessed by 2019-07-23
4. GitHub - viaduck/mariadbpp: C++ client library for MariaDB. Continuation of https://code.launchpad.net/mariadb++, https://github.com/viaduck/mariadbpp, Last Modified 2019-07-23, Accessed by 2019-07-23

반응형

+ Recent posts