[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/
(Maria Connectors)
https://downloads.mariadb.org/
3단계: libmariadb.dll 문제
(아래 파일로 작업을 하시는 분들은 64bit로 디버그, 릴리즈하셔야 합니다.
MariaDB 10.4 64bit 버전에서 추출하였습니다.)
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
'소프트웨어(SW) > MS - C++ (GUI) MFC' 카테고리의 다른 글
[MS C++(MFC)] Visual C++ 샘플 사이트 소개 및 백업 안내 (7) | 2019.11.15 |
---|---|
[MS Visual C++] Visual Studio 2019(C++ MFC) 사용하기 및 OpenCV 4.1 환경설정 (11) | 2019.11.13 |
[MFC] 윈도우 프로그래밍 기초 - 트리 컨트롤 (7) | 2015.04.02 |
[MFC] 윈도우 프로그래밍 기초 - 순수한 List Control 배우기 (1) | 2015.04.01 |
[MFC] 윈도우 프로그래밍 기초 - 프로그래스 컨트롤 (1) | 2015.03.31 |