home document 전체 글 tag 태그 open-book 방명록 pencil 글쓰기 settings 설정
[017] C++ ODBC를 이용한 데이터베이스 연결
[017] C++ ODBC를 이용한 데이터베이스 연결
2024. 11. 17. 19:38 programming/project

DevLog

예전 글에서 한번 적었던 적은 있었는데

더 사용하기 편하게 구조를 수정하고 여러 문제들도 수정했다.

 

 

 

 

auto result{ Database::Query{ Database::Type::Game }
    .Statement(L"SELECT * FROM [dbo].[account] WHERE [register_date] > ?")
    .Param(1, Time{ 2024, 11, 1, 0, 0, 0 })
    .Execute()
};

int64_t id{};
std::wstring name(16, L'\0');
std::wstring password(16, L'\0');
Time registerDate{};
result.Bind(1, &id)
    .Bind(2, &name)
    .Bind(3, &password)
    .Bind(4, &registerDate);
while (result.Fetch())
{
    ::OutputDebugString(L"FETCH\n");
}

쿼리 같은 경우는 위와 같이 사용할 수 있다.

Param 함수로 Placeholder에 원하는 데이터를 설정할 수 있고 Execute를 호출하면 실행한다.

 

Execute 함수는 class Result를 반환하고 ResultBind 함수를 통해 SELECT 된 컬럼에 대응시킬 변수를 설정할 수 있다.

그 후 Fetch 함수를 통해 각 row 를 순회할 수 있다.

 

 

 

 

 

int32_t ret{ -1 };
auto result{ Database::StoredProcedure{ Database::Type::Game }
    .Statement(L"{ ? = CALL [get_account_id] (?) }")
    .Out(1, &ret)
    .In(2, L"laivy")
    .Execute()
};

SP의 경우는 위와 같이 사용할 수 있다.

In 함수는 Param 함수와 동일하고, Out 함수로는 SP로부터 설정된 값을 받아올 수 있다.

위의 예시에서는 SP 호출의 반환값을 가져오도록 했다.

 

 

 

 

 

DLL_API StoredProcedure::Result StoredProcedure::Execute()
{
    if (!m_stmt)
    {
        assert(false);
        return Result{ nullptr };
    }

    if (!SQL_SUCCEEDED(::SQLExecute(*m_stmt)))
    {
        assert(false);
        return Result{ nullptr };
    }

    // SP 반환값
    if (!SQL_SUCCEEDED(::SQLMoreResults(*m_stmt)))
    {
        assert(false);
        return Result{ nullptr };
    }

    return Result{ std::move(m_stmt) };
}

SP안에 SELECT, UPDATE, DELETE 구문이 있을 때 반환값을 못가져오는 문제가 있었는데

이 문제 수정하기 위해 몇 시간동안 인터넷을 찾아본지 모르겠다...

SP안에 SET NOCOUNT ON 넣으면 잘되는걸 확인했는데 모든 SP에 그걸 넣을 수는 없어서 더 찾아봤더니

SQLMoreResults 를 호출해줘야 된다는 것을 알아냈다.

 

 

 

 

 

UPDATE [dbo].[account]
SET [register_date] = DATEADD(SECOND, 10, [register_date])
WHERE [name] = @name

SELECT *
FROM [dbo].[account]

RETURN 12345

SP는 위와 같이 여러개의 구문으로 이루어질 수 있기 때문에 결과가 여러개일 수 있다.

위의 경우 1. 반환값, 2. SELECT 결과, 3. UPDATE 영향 받은 행 수 총 3가지다.

자세하게는 알아보지 않았지만 SP의 경우 SQLMoreResults 한번은 무조건 해줘야되는 것으로 보이고 그 후의 결과 순서는 잘 모르겠다.

나중에 문제가 생기면 그때 가서 더 자세히 알아봐야겠다.

'programming > project' 카테고리의 다른 글

[019] 서술자 힙 관리 클래스  (0) 2025.05.01
[018] 회원가입, 로그인 구현  (0) 2025.02.27
[016] Github Actions 자동 빌드 추가  (0) 2024.10.20
[015] 렌더링 구조 변경  (0) 2024.10.19
[014] 로그인서버2  (0) 2024.06.24