
예전 글에서 한번 적었던 적은 있었는데
더 사용하기 편하게 구조를 수정하고 여러 문제들도 수정했다.
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, ®isterDate);
while (result.Fetch())
{
::OutputDebugString(L"FETCH\n");
}
쿼리 같은 경우는 위와 같이 사용할 수 있다.
Param 함수로 Placeholder에 원하는 데이터를 설정할 수 있고 Execute를 호출하면 실행한다.
Execute 함수는 class Result를 반환하고 Result의 Bind 함수를 통해 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 |