JNetLibray
로딩중...
검색중...
일치하는것 없음
jnet::JNetDBConn 클래스 참조

DB Connection 추상화 더 자세히 ...

#include <JNetDB.h>

Public 멤버 함수

 JNetDBConn ()
 
 JNetDBConn (BOOL connectionErrorFileLogFlag)
 
 ~JNetDBConn ()
 
bool Connect (SQLHENV henv, const WCHAR *connectionString)
 
void Clear ()
 
bool Ping ()
 
bool Execute (const WCHAR *query)
 
bool Fetch ()
 
bool GetSQLData (INT32 &data)
 
INT32 GetRowCount ()
 
void Unbind ()
 
bool BindParam (INT32 paramIndex, bool *value)
 
bool BindParam (INT32 paramIndex, float *value)
 
bool BindParam (INT32 paramIndex, double *value)
 
bool BindParam (INT32 paramIndex, INT8 *value)
 
bool BindParam (INT32 paramIndex, INT16 *value)
 
bool BindParam (INT32 paramIndex, INT32 *value)
 
bool BindParam (INT32 paramIndex, INT64 *value)
 
bool BindParam (INT32 paramIndex, TIMESTAMP_STRUCT *value)
 
bool BindParam (INT32 paramIndex, const WCHAR *str)
 
bool BindParam (INT32 paramIndex, const BYTE *bin, INT32 size)
 
bool BindCol (INT32 columnIndex, bool *value)
 
bool BindCol (INT32 columnIndex, float *value)
 
bool BindCol (INT32 columnIndex, double *value)
 
bool BindCol (INT32 columnIndex, INT8 *value)
 
bool BindCol (INT32 columnIndex, INT16 *value)
 
bool BindCol (INT32 columnIndex, INT32 *value)
 
bool BindCol (INT32 columnIndex, INT64 *value)
 
bool BindCol (INT32 columnIndex, TIMESTAMP_STRUCT *value)
 
bool BindCol (INT32 columnIndex, WCHAR *str, INT32 size, SQLLEN *index)
 
bool BindCol (INT32 columnIndex, BYTE *bin, INT32 size, SQLLEN *index)
 
bool BindParam (SQLUSMALLINT paramIndex, SQLSMALLINT cType, SQLSMALLINT sqlType, SQLULEN len, SQLPOINTER ptr, SQLLEN *index)
 
bool BindCol (SQLUSMALLINT columnIndex, SQLSMALLINT cType, SQLULEN len, SQLPOINTER value, SQLLEN *index)
 

Private 멤버 함수

void HandleError (SQLRETURN ret, SQLSMALLINT errMsgBuffLen=0, SQLWCHAR *errMsgOut=NULL, SQLSMALLINT *errMsgLenOut=NULL)
 
void HandleError (SQLRETURN ret, SQLSMALLINT hType, SQLHANDLE handle, SQLSMALLINT errMsgBuffLen=0, SQLWCHAR *errMsgOut=NULL, SQLSMALLINT *errMsgLenOut=NULL)
 
void ErrorMsgFileLogging (const SQLWCHAR *errMsg, SQLSMALLINT errMsgLen, const std::wstring &filePath)
 

Private 속성

SQLHDBC m_DBConnection = SQL_NULL_HANDLE
 
SQLHSTMT m_Statement = SQL_NULL_HANDLE
 
bool m_ConnectionErrorFileLogFlag
 
const wchar_t * m_ConnectionErrLogFile = L"ConnectionErrLog.txt"
 

정적 Private 속성

static std::mutex m_LogFileMtx
 

상세한 설명

DB Connection 추상화

생성자 & 소멸자 문서화

◆ JNetDBConn() [1/2]

jnet::JNetDBConn::JNetDBConn ( )
inline
31: JNetDBConn(false) {}
JNetDBConn()
Definition JNetDB.h:31

◆ JNetDBConn() [2/2]

jnet::JNetDBConn::JNetDBConn ( BOOL connectionErrorFileLogFlag)
inline
32: m_ConnectionErrorFileLogFlag(connectionErrorFileLogFlag) {}
bool m_ConnectionErrorFileLogFlag
Definition JNetDB.h:26

◆ ~JNetDBConn()

jnet::JNetDBConn::~JNetDBConn ( )
inline
33 {
34 Clear();
35 }
void Clear()
Definition JNetDB.cpp:71

멤버 함수 문서화

◆ Connect()

bool JNetDBConn::Connect ( SQLHENV henv,
const WCHAR * connectionString )
13{
14 SQLRETURN ret;
15
16 // 1. 전달받은 SQL 환경 핸들을 바탕으로 실제 커넥션 핸들을 할당받는다.
17 if (::SQLAllocHandle(SQL_HANDLE_DBC, henv, &m_DBConnection) != SQL_SUCCESS)
18 return false;
19
20 // 2. 커넥션 문자열을 바탕으로 실질적인 DB 연결 수행
21 WCHAR stringBuffer[MAX_PATH] = { 0 };
22 ::wcscpy_s(stringBuffer, connectionString);
23
24 WCHAR resultString[MAX_PATH] = { 0 };
25 SQLSMALLINT resultStringLen = 0;
26
27 ret = ::SQLDriverConnectW( // WCHAR 문자열 전용 연결 함수 호출
29 NULL,
30 reinterpret_cast<SQLWCHAR*>(stringBuffer),
31 _countof(stringBuffer),
32 OUT reinterpret_cast<SQLWCHAR*>(resultString), // 결과 메시지 저장
33 _countof(resultString),
34 OUT & resultStringLen,
35 SQL_DRIVER_NOPROMPT
36 );
37
38 if (!(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)) {
40 SQLWCHAR errMsgOut[WVARCHAR_MAX] = { NULL };
41 SQLSMALLINT errMsgLen = 0;
42 HandleError(ret, SQL_HANDLE_DBC, m_DBConnection, sizeof(errMsgOut), errMsgOut, &errMsgLen);
43 ErrorMsgFileLogging(errMsgOut, errMsgLen, m_ConnectionErrLogFile);
44 }
45 else {
46 HandleError(ret, SQL_HANDLE_DBC, m_DBConnection);
47 }
48
49
50
51 return false;
52 }
53
54 // 3. statement 핸들을 할당 받는다.
55 if ((ret = ::SQLAllocHandle(SQL_HANDLE_STMT, m_DBConnection, &m_Statement)) != SQL_SUCCESS) {
57 SQLWCHAR errMsgOut[WVARCHAR_MAX] = { NULL };
58 SQLSMALLINT errMsgLen = 0;
59 HandleError(ret, sizeof(errMsgOut), (SQLWCHAR*)errMsgOut, &errMsgLen);
60 ErrorMsgFileLogging(errMsgOut, errMsgLen, m_ConnectionErrLogFile);
61 }
62 else {
63 HandleError(ret);
64 }
65 return false;
66 }
67
68 return (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO);
69}
#define OUT
Definition WinSocketAPI.h:14
void HandleError(SQLRETURN ret, SQLSMALLINT errMsgBuffLen=0, SQLWCHAR *errMsgOut=NULL, SQLSMALLINT *errMsgLenOut=NULL)
Definition JNetDB.cpp:319
void ErrorMsgFileLogging(const SQLWCHAR *errMsg, SQLSMALLINT errMsgLen, const std::wstring &filePath)
Definition JNetDB.cpp:423
const wchar_t * m_ConnectionErrLogFile
Definition JNetDB.h:27
SQLHDBC m_DBConnection
Definition JNetDB.h:20
SQLHSTMT m_Statement
Definition JNetDB.h:24
@ WVARCHAR_MAX
Definition JNetDB.h:11

◆ Clear()

void JNetDBConn::Clear ( )
72{
73 // 할당받은 핸들 정리
74
75 if (m_DBConnection != SQL_NULL_HANDLE)
76 {
77 ::SQLFreeHandle(SQL_HANDLE_DBC, m_DBConnection);
78 m_DBConnection = SQL_NULL_HANDLE;
79 }
80
81 if (m_Statement != SQL_NULL_HANDLE)
82 {
83 ::SQLFreeHandle(SQL_HANDLE_STMT, m_Statement);
84 m_Statement = SQL_NULL_HANDLE;
85 }
86}

◆ Ping()

bool JNetDBConn::Ping ( )
89{
90 const SQLWCHAR* pingQuery = L"SELECT 1";
91 return Execute(pingQuery);
92}
bool Execute(const WCHAR *query)
Definition JNetDB.cpp:94

◆ Execute()

bool JNetDBConn::Execute ( const WCHAR * query)
95{
96 // SQL 쿼리를 인자로 받아, SQLExecDirect 함수에 전달
97 SQLRETURN ret = ::SQLExecDirectW(m_Statement, (SQLWCHAR*)query, SQL_NTSL);
98 if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
99 return true;
100 }
101
103 SQLWCHAR errMsgOut[WVARCHAR_MAX];
104 SQLSMALLINT errMsgLen = 0;
105 HandleError(ret, sizeof(errMsgOut), (SQLWCHAR*)errMsgOut, &errMsgLen);
106 ErrorMsgFileLogging(errMsgOut, errMsgLen, m_ConnectionErrLogFile);
107 }
108 else {
109 HandleError(ret);
110 }
111
112 return false;
113}

◆ Fetch()

bool JNetDBConn::Fetch ( )
116{
117 // SQLFetch가 성공 반환 시, 수신 받을 데이터가 존재
118 SQLRETURN ret = ::SQLFetch(m_Statement);
119
120 switch (ret)
121 {
122 case SQL_SUCCESS:
123 case SQL_SUCCESS_WITH_INFO:
124 return true;
125 case SQL_NO_DATA: // 쿼리는 성공이나 반환 데이터가 없는 경우
126 return false;
127 case SQL_ERROR: // 쿼리 수행 자체에서 문제 발생
128 {
130 SQLWCHAR errMsgOut[WVARCHAR_MAX];
131 SQLSMALLINT errMsgLen = 0;
132 HandleError(ret, sizeof(errMsgOut), (SQLWCHAR*)errMsgOut, &errMsgLen);
133 ErrorMsgFileLogging(errMsgOut, errMsgLen, m_ConnectionErrLogFile);
134 }
135 else {
136 HandleError(ret);
137 }
138 }
139 return false;
140 default:
141 return true;
142 }
143}

◆ GetSQLData()

bool JNetDBConn::GetSQLData ( INT32 & data)
146{
147 SQLLEN indicator;
148 SQLINTEGER count;
149 SQLRETURN ret = SQLGetData(m_Statement, 1, SQL_C_SLONG, &count, sizeof(count), &indicator);
150 if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
151 data = count;
152 return true;
153 }
154
155 return false;
156}

◆ GetRowCount()

INT32 JNetDBConn::GetRowCount ( )
159{
160 SQLLEN count = 0;
161 SQLRETURN ret = ::SQLRowCount(m_Statement, OUT & count);
162
163 if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
164 return static_cast<INT32>(count);
165
166 return -1;
167}

◆ Unbind()

void JNetDBConn::Unbind ( )
286{
287 ::SQLFreeStmt(m_Statement, SQL_UNBIND);
288 ::SQLFreeStmt(m_Statement, SQL_RESET_PARAMS);
289 ::SQLFreeStmt(m_Statement, SQL_CLOSE);
290}

◆ BindParam() [1/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
bool * value )
169 {
170 SQLLEN index = 0;
171 return BindParam(paramIndex, SQL_C_TINYINT, SQL_TINYINT, sizeof(bool), value, &index);
172}
bool BindParam(INT32 paramIndex, bool *value)
Definition JNetDB.cpp:169

◆ BindParam() [2/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
float * value )
173 {
174 SQLLEN index = 0;
175 return BindParam(paramIndex, SQL_C_FLOAT, SQL_FLOAT, 0, value, &index); // 일반 정수가 아닌 경우 'len'은 0
176}

◆ BindParam() [3/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
double * value )
177 {
178 SQLLEN index = 0;
179 return BindParam(paramIndex, SQL_C_DOUBLE, SQL_DOUBLE, 0, value, &index);
180}

◆ BindParam() [4/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
INT8 * value )
181 {
182 SQLLEN index = 0;
183 return BindParam(paramIndex, SQL_C_TINYINT, SQL_TINYINT, sizeof(INT8), value, &index);
184}

◆ BindParam() [5/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
INT16 * value )
185 {
186 SQLLEN index = 0;
187 return BindParam(paramIndex, SQL_C_SHORT, SQL_SMALLINT, sizeof(INT16), value, &index);
188}

◆ BindParam() [6/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
INT32 * value )
189 {
190 SQLLEN index = 0;
191 return BindParam(paramIndex, SQL_C_LONG, SQL_INTEGER, sizeof(INT32), value, &index);
192}

◆ BindParam() [7/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
INT64 * value )
193 {
194 SQLLEN index = 0;
195 return BindParam(paramIndex, SQL_C_SBIGINT, SQL_BIGINT, sizeof(INT64), value, &index);
196}

◆ BindParam() [8/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
TIMESTAMP_STRUCT * value )
197 {
198 SQLLEN index = 0;
199 return BindParam(paramIndex, SQL_C_TYPE_TIMESTAMP, SQL_TYPE_TIMESTAMP, sizeof(TIMESTAMP_STRUCT), value, &index);
200}

◆ BindParam() [9/11]

bool jnet::JNetDBConn::BindParam ( INT32 paramIndex,
const WCHAR * str )

◆ BindParam() [10/11]

bool JNetDBConn::BindParam ( INT32 paramIndex,
const BYTE * bin,
INT32 size )
210 {
211 SQLLEN index;
212 if (bin == nullptr)
213 {
214 index = SQL_NULL_DATA;
215 size = 1;
216 }
217 else {
218 index = size;
219 }
220
221 if (size > BINARY_MAX)
222 return BindParam(paramIndex, SQL_C_BINARY, SQL_LONGVARBINARY, size, (BYTE*)bin, &index);
223 else
224 return BindParam(paramIndex, SQL_C_BINARY, SQL_BINARY, size, (BYTE*)bin, &index);
225}
unsigned char BYTE
Definition CommTypes.h:3
@ BINARY_MAX
Definition JNetDB.h:12

◆ BindCol() [1/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
bool * value )
228{
229 SQLLEN index = 0;
230 return BindCol(columnIndex, SQL_C_TINYINT, sizeof(bool), value, &index);
231}
bool BindCol(INT32 columnIndex, bool *value)
Definition JNetDB.cpp:227

◆ BindCol() [2/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
float * value )
234{
235 SQLLEN index = 0;
236 return BindCol(columnIndex, SQL_C_FLOAT, sizeof(float), value, &index);
237}

◆ BindCol() [3/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
double * value )
240{
241 SQLLEN index = 0;
242 return BindCol(columnIndex, SQL_C_DOUBLE, sizeof(double), value, &index);
243}

◆ BindCol() [4/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
INT8 * value )
246{
247 SQLLEN index = 0;
248 return BindCol(columnIndex, SQL_C_TINYINT, sizeof(INT8), value, &index);
249}

◆ BindCol() [5/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
INT16 * value )
252{
253 SQLLEN index = 0;
254 return BindCol(columnIndex, SQL_C_SHORT, sizeof(INT16), value, &index);
255}

◆ BindCol() [6/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
INT32 * value )
258{
259 SQLLEN index = 0;
260 return BindCol(columnIndex, SQL_C_LONG, sizeof(INT32), value, &index);
261}

◆ BindCol() [7/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
INT64 * value )
264{
265 SQLLEN index = 0;
266 return BindCol(columnIndex, SQL_C_SBIGINT, sizeof(INT64), value, &index);
267}

◆ BindCol() [8/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
TIMESTAMP_STRUCT * value )
270{
271 SQLLEN index = 0;
272 return BindCol(columnIndex, SQL_C_TYPE_TIMESTAMP, sizeof(TIMESTAMP_STRUCT), value, &index);
273}

◆ BindCol() [9/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
WCHAR * str,
INT32 size,
SQLLEN * index )
276{
277 return BindCol(columnIndex, SQL_C_WCHAR, size, str, index);
278}

◆ BindCol() [10/11]

bool JNetDBConn::BindCol ( INT32 columnIndex,
BYTE * bin,
INT32 size,
SQLLEN * index )
281{
282 return BindCol(columnIndex, SQL_BINARY, size, bin, index);
283}

◆ BindParam() [11/11]

bool JNetDBConn::BindParam ( SQLUSMALLINT paramIndex,
SQLSMALLINT cType,
SQLSMALLINT sqlType,
SQLULEN len,
SQLPOINTER ptr,
SQLLEN * index )
293{
294 // len: 데이터 크기
295 // ptr: 전달되는 데이터(포인터)
296 // index: 문자열과 같은 가변 길이 데이터에서 필요한 인수, 일반적으로 고정 크기 데이터의 경우 0을 담은 정수 변수의 포인터를 전달
297 SQLRETURN ret = ::SQLBindParameter(m_Statement, paramIndex, SQL_PARAM_INPUT, cType, sqlType, len, 0, ptr, 0, index);
298 if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
299 {
300 HandleError(ret);
301 return false;
302 }
303
304 return true;
305}

◆ BindCol() [11/11]

bool JNetDBConn::BindCol ( SQLUSMALLINT columnIndex,
SQLSMALLINT cType,
SQLULEN len,
SQLPOINTER value,
SQLLEN * index )
308{
309 SQLRETURN ret = ::SQLBindCol(m_Statement, columnIndex, cType, value, len, index);
310 if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
311 {
312 HandleError(ret);
313 return false;
314 }
315
316 return true;
317}

◆ HandleError() [1/2]

void JNetDBConn::HandleError ( SQLRETURN ret,
SQLSMALLINT errMsgBuffLen = 0,
SQLWCHAR * errMsgOut = NULL,
SQLSMALLINT * errMsgLenOut = NULL )
private
320{
321 if (ret == SQL_SUCCESS)
322 return;
323
324 SQLSMALLINT index = 1;
325 SQLWCHAR sqlState[MAX_PATH] = { 0 };
326 SQLINTEGER nativeErr = 0;
327 SQLWCHAR errMsg[MAX_PATH] = { 0 }; // 에러 사유 저장
328 SQLSMALLINT msgLen = 0;
329 SQLRETURN errorRet = 0;
330
331 SQLSMALLINT errMsgOffset = 0;
332 if (errMsgLenOut != NULL) {
333 *errMsgLenOut = 0;
334 }
335
336 while (true)
337 {
338 errorRet = ::SQLGetDiagRecW( // 에러 메시지 추출 함수
339 SQL_HANDLE_STMT,
341 index,
342 sqlState,
343 OUT & nativeErr,
344 errMsg,
345 _countof(errMsg),
346 OUT & msgLen
347 );
348
349 // 에러가 없거나, 성공이 였다면 루프 탈출
350 if (errorRet == SQL_NO_DATA)
351 break;
352 // SQLGetDiagRecW 함수 자체의 에러 반환
353 if (errorRet != SQL_SUCCESS && errorRet != SQL_SUCCESS_WITH_INFO)
354 break;
355
356 if (errMsgBuffLen >= errMsgOffset + msgLen + 1) {
357 if (errMsgOut != NULL && errMsgLenOut != NULL) {
358 std::wcout.imbue(std::locale("kor"));
359 memcpy(&errMsgOut[errMsgOffset], errMsg, sizeof(WCHAR) * msgLen);
360 errMsgOut[errMsgOffset + msgLen] = NULL;
361 errMsgOffset += (msgLen + 1);
362 *errMsgLenOut += msgLen + 1;
363 }
364 }
365
366 index++;
367 }
368}

◆ HandleError() [2/2]

void JNetDBConn::HandleError ( SQLRETURN ret,
SQLSMALLINT hType,
SQLHANDLE handle,
SQLSMALLINT errMsgBuffLen = 0,
SQLWCHAR * errMsgOut = NULL,
SQLSMALLINT * errMsgLenOut = NULL )
private
371{
372 if (ret == SQL_SUCCESS)
373 return;
374
375 SQLSMALLINT index = 1;
376 SQLWCHAR sqlState[MAX_PATH] = { 0 };
377 SQLINTEGER nativeErr = 0;
378 SQLWCHAR errMsg[MAX_PATH] = { 0 }; // 에러 사유 저장
379 SQLSMALLINT msgLen = 0;
380 SQLRETURN errorRet = 0;
381
382 SQLSMALLINT errMsgOffset = 0;
383 if (errMsgLenOut != NULL) {
384 *errMsgLenOut = 0;
385 }
386
387 while (true)
388 {
389 errorRet = ::SQLGetDiagRecW( // 에러 메시지 추출 함수
390 hType,
391 handle,
392 index,
393 sqlState,
394 OUT & nativeErr,
395 errMsg,
396 _countof(errMsg),
397 OUT & msgLen
398 );
399
400 // 에러가 없거나, 성공이 였다면 루프 탈출
401 if (errorRet == SQL_NO_DATA)
402 break;
403 // SQLGetDiagRecW 함수 자체의 에러 반환
404 if (errorRet != SQL_SUCCESS && errorRet != SQL_SUCCESS_WITH_INFO)
405 break;
406
407 std::wcout << errMsg << std::endl;
408
409 if (errMsgBuffLen >= errMsgOffset + msgLen + 1) {
410 if (errMsgOut != NULL && errMsgLenOut != NULL) {
411 std::wcout.imbue(std::locale("kor"));
412 memcpy(&errMsgOut[errMsgOffset], errMsg, sizeof(WCHAR) * msgLen);
413 errMsgOut[errMsgOffset + msgLen] = NULL;
414 errMsgOffset += (msgLen + 1);
415 *errMsgLenOut += msgLen + 1;
416 }
417 }
418
419 index++;
420 }
421}

◆ ErrorMsgFileLogging()

void JNetDBConn::ErrorMsgFileLogging ( const SQLWCHAR * errMsg,
SQLSMALLINT errMsgLen,
const std::wstring & filePath )
private
424{
425 auto now = std::chrono::system_clock::now();
426 auto in_time_t = std::chrono::system_clock::to_time_t(now);
427 std::tm buf;
428 localtime_s(&buf, &in_time_t);
429 std::wstringstream ss;
430 ss << std::put_time(&buf, L"[%Y.%m.%d %H:%M:%S]");
431 std::wstring nowStr = ss.str();
432
433 std::lock_guard<std::mutex> lockGuard(m_LogFileMtx);
434
435 const wchar_t* ptr;
436 std::wofstream outFile(filePath, std::ios::app); // append 모드로 파일 열기
437 if (!outFile) {
438 std::wcerr << L"Failed to open file for writing: " << filePath << std::endl;
439 return;
440 }
441
442 outFile << nowStr << std::endl;
443
444 for (int i = 0; i < errMsgLen;) {
445 ptr = &errMsg[i];
446 if (*ptr == L'\0') {
447 i++;
448 }
449 else {
450 outFile << ptr << std::endl;
451 i += wcslen(ptr) + 1;
452 }
453 }
454
455 outFile << std::endl;
456 outFile.close();
457}
static std::mutex m_LogFileMtx
Definition JNetDB.h:28

멤버 데이터 문서화

◆ m_DBConnection

SQLHDBC jnet::JNetDBConn::m_DBConnection = SQL_NULL_HANDLE
private

◆ m_Statement

SQLHSTMT jnet::JNetDBConn::m_Statement = SQL_NULL_HANDLE
private

◆ m_ConnectionErrorFileLogFlag

bool jnet::JNetDBConn::m_ConnectionErrorFileLogFlag
private

◆ m_ConnectionErrLogFile

const wchar_t* jnet::JNetDBConn::m_ConnectionErrLogFile = L"ConnectionErrLog.txt"
private

◆ m_LogFileMtx

std::mutex JNetDBConn::m_LogFileMtx
staticprivate

이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: