본문 바로가기
C++ GUI

C++ GUI : Console에서 mariaDB ADO 사용하기

by taekho 2026. 5. 10.

 

1. mariaDB ODBC 설치는 다음을 참고하세요.

https://taekho.tistory.com/28

 

C++ : matiaDB ODBC 설치하기

1. mariaDB Server ODBC Driver를 설치한다.https://mariadb.com/downloads/connectors/ Download MariaDB Products & Tools | MariaDBDownload MariaDB products, connectors, and tools including Community Server, Enterprise Server, ColumnStore and MaxScale.mari

taekho.tistory.com

 

2. DBManager.h 파일을 추가한다.

#pragma once

#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" \
    no_namespace rename("EOF", "adoEOF") \
    rename("BOF", "adoBOF")

class DBManager
{
private:
    _ConnectionPtr m_conn;

public:
    DBManager();
    ~DBManager();

    bool Connect();

    _ConnectionPtr GetConnection();
};

 

3. DBManager.cpp 파일을 추가한다.

#include "DBManager.h"

DBManager::DBManager()
{
    CoInitialize(NULL);
}

DBManager::~DBManager()
{
    if (m_conn != nullptr)
    {
        m_conn->Close();
    }

    CoUninitialize();
}

bool DBManager::Connect()
{
    HRESULT hr =
        m_conn.CreateInstance(__uuidof(Connection));

    if (FAILED(hr))
        return false;

    m_conn->Open(
        L"Provider=MSDASQL;"
        L"Driver={MariaDB ODBC 3.2 Driver};"
        L"Server=127.0.0.1;"
        L"Port=3306;"
        L"Database=database1;"
        L"User=user1;"
        L"Password=password1;"
        L"CHARSET=utf8mb4;",
        L"",
        L"",
        adConnectUnspecified
    );

    return true;
}

_ConnectionPtr DBManager::GetConnection()
{
    return m_conn;
}

 

4. MemberDTO.h 파일을 추가한다.

#pragma once

#include <string>

class MemberDTO
{
public:
    long id;

    std::wstring forename;
    std::wstring surname;
    std::wstring email;
    std::wstring password;
    std::wstring joined;
    std::wstring picture;
	MemberDTO() : id(0) {}  
};

 

5. MemberDAO.h 파일을 추가한다.

#pragma once

#include <vector>

#include "DBManager.h"
#include "MemberDTO.h"

class MemberDAO
{
private:
    DBManager* m_db;

public:
    MemberDAO(DBManager* db);

    std::vector<MemberDTO> GetAll();

    bool Insert(MemberDTO dto);
};

 

6.  MemberDAO.cpp 파일을 추가한다.

#include "MemberDAO.h"

MemberDAO::MemberDAO(DBManager* db)
{
    m_db = db;
}

std::vector<MemberDTO> MemberDAO::GetAll()
{
    std::vector<MemberDTO> list;

    _RecordsetPtr rs;

    rs.CreateInstance(__uuidof(Recordset));

    rs->Open(
        L"SELECT id, forename, surname, email FROM member",
        _variant_t((IDispatch*)m_db->GetConnection()),
        adOpenStatic,
        adLockReadOnly,
        adCmdText
    );

    while (!rs->adoEOF)
    {
        MemberDTO dto;

        dto.id = rs->GetCollect("id");

        dto.forename = (wchar_t*)(_bstr_t)rs->GetCollect("forename");

        dto.surname = (wchar_t*)(_bstr_t) rs->GetCollect("surname");

        dto.email = (wchar_t*)(_bstr_t)rs->GetCollect("email");

        list.push_back(dto);

        rs->MoveNext();
    }

    rs->Close();

    return list;
}

bool MemberDAO::Insert(MemberDTO dto)
{
    _CommandPtr cmd;

    cmd.CreateInstance(__uuidof(Command));

    cmd->ActiveConnection = m_db->GetConnection();

    cmd->CommandType = adCmdText;

    cmd->CommandText =
        L"INSERT INTO member (forename, surname, email) VALUES (?, ?, ?)";

    cmd->Parameters->Append(
        cmd->CreateParameter(
            L"forename",
            adVarWChar,
            adParamInput,
            50,
            _variant_t(dto.forename.c_str())
        )
    );

    cmd->Parameters->Append(
        cmd->CreateParameter(
            L"surname",
            adVarWChar,
            adParamInput,
            50,
            _variant_t(dto.surname.c_str())
        )
    );

    cmd->Parameters->Append(
        cmd->CreateParameter(
            L"email",
            adVarWChar,
            adParamInput,
            100,
            _variant_t(dto.email.c_str())
        )
    );

    cmd->Execute(NULL, NULL, adCmdText);

    return true;
}

 

7. main.cpp 파일을 추가한다.

#include <iostream>
#include <fcntl.h>
#include <io.h>

#include "DBManager.h"
#include "MemberDAO.h"

using namespace std;

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);

    try
    {
        DBManager db;

        if (!db.Connect())
        {
            wcout << L"DB 연결 실패"
                << endl;

            return -1;
        }

        MemberDAO dao(&db);

        vector<MemberDTO> list = dao.GetAll();

        for (auto& dto : list)
        {
            wcout << L"ID: " << dto.id
                << L", Forename: " << dto.forename
                << L", Surname: " << dto.surname
                << L", Email: " << dto.email
                << endl;
        }

        MemberDTO dto;

        dto.forename = L"홍6";
        dto.surname = L"길동6";
        dto.email = L"hong6@test.com";

        dao.Insert(dto);

        wcout << L"-----------------------------" << endl;

        wcout << L"Insert 완료" << endl;

        vector<MemberDTO> list2 =
            dao.GetAll();

        for (auto& dto : list2)
        {
            wcout << L"ID: " << dto.id 
                << L", Forename: " << dto.forename 
                << L", Surname: " << dto.surname
                << L", Email: " << dto.email
                << endl;
        }

    }
    catch (_com_error& e)
    {
        wcout << L"COM Error: " << e.ErrorMessage() << endl;
    }

    return 0;
}

 

8. mariaDB를 실행한다.

 

9. 프로그램을 실행한다.