BOOL CQuery::Exec(LPCTSTR szSQL) { int c; if( S_TYPE != ST_CASHSHOPSERVER ) { g_Window.ServerLogAdd(S_TYPE,"%s", szSQL); } ret=SQLExecDirect(hStmt,(SQLCHAR *)szSQL,SQL_NTS); if ((ret != SQL_SUCCESS) && (ret != SQL_SUCCESS_WITH_INFO) && (ret != SQL_NO_DATA)) { PrintDiag(); return FALSE; } SQLRowCount(hStmt,&AffectCount); SQLNumResultCols(hStmt,&nCol); if (nCol > MAXCOL) { //::MessageBox(NULL,"nCol > MAXCOL","CQuery error",MB_OK); g_Window.ServerLogAdd(S_TYPE,"CQuery error : nCol > MAXCOL"); return FALSE; } if (nCol == 0) { Clear(); return TRUE; } for (c=0;c<nCol;c++) { SQLBindCol(hStmt,c+1,SQL_C_CHAR,Col[c],255,&lCol[c]); SQLDescribeCol(hStmt,c+1,ColName[c],30,NULL,NULL,NULL,NULL,NULL); } return TRUE; }
// SQL문을 실행한다. 실패시 진단 정보를 출력하고 FALSE를 리턴한다. BOOL CQuery::Exec(LPCTSTR szSQL) { int c; while( true ) { gWindow.PrintLog("%s", szSQL); // SQL문을 실행한다. SQL_NO_DATA를 리턴한 경우도 일단 성공으로 취급한다. // 이 경우 Fetch에서 EOF를 리턴하도록 되어 있기 때문에 진단 정보를 출력할 필요는 없다. ret=SQLExecDirect(hStmt,(SQLCHAR *)szSQL,SQL_NTS); if ((ret != SQL_SUCCESS) && (ret != SQL_SUCCESS_WITH_INFO) && (ret != SQL_NO_DATA)) { bool bReConnect = false; PrintDiag(bReConnect); Clear(); if(bReConnect == true) { ::Sleep(1); continue; } return FALSE; } // Update, Delete, Insert 명령시 영향받은 레코드 개수를 구해 놓는다. SQLRowCount(hStmt,&AffectCount); SQLNumResultCols(hStmt,&nCol); if (nCol > MAXCOL) { //::MessageBox(NULL,"최대 컬럼 수를 초과했습니다","CQuery 에러",MB_OK); gWindow.PrintLog("CQuery error :최대 컬럼 수를 초과했습니다"); return FALSE; } // nCol이 0인 경우는 Select문 이외의 다른 명령을 실행한 경우이므로 // 바인딩을 할 필요가 없다. if (nCol == 0) { Clear(); return TRUE; } // 모든 컬럼을 문자열로 바인딩해 놓는다. Col배열은 zero base, // 컬럼 번호는 one base임에 유의할 것 for (c=0;c<nCol;c++) { SQLBindCol(hStmt,c+1,SQL_C_CHAR,Col[c],255,&lCol[c]); SQLDescribeCol(hStmt,c+1,ColName[c],30,NULL,NULL,NULL,NULL,NULL); } return TRUE; } }
// BLOB 데이터를 buf에 채워준다. 이때 buf는 충분한 크기의 메모리를 미리 할당해 // 놓아야 한다. NULL일 경우 0을 리턴하고 에러 발생시 -1을 리턴한다. 성공시 읽은 // 총 바이트 수를 리턴한다. szSQL은 하나의 BLOB 필드를 읽는 Select SQL문이어야 한다. int CQuery::ReadBlob(LPCTSTR szSQL, void *buf) { SQLCHAR BinaryPtr[BLOBBATCH]; SQLINTEGER LenBin; char *p; int nGet; int TotalGet=0; //gWindow.PrintLog("%s", szSQL); while( true ) { ret=SQLExecDirect(hStmt,(SQLCHAR *)szSQL,SQL_NTS); if (ret!=SQL_SUCCESS) { bool bReconnect = false; PrintDiag(bReconnect); if(bReconnect == true){ ::Sleep(1); continue; } return -1; } while ((ret=SQLFetch(hStmt)) != SQL_NO_DATA) { p=(char *)buf; while ((ret=SQLGetData(hStmt,1,SQL_C_BINARY,BinaryPtr,sizeof(BinaryPtr), &LenBin))!=SQL_NO_DATA) { if (LenBin==SQL_NULL_DATA) { Clear(); return 0; } if (ret==SQL_SUCCESS) nGet=LenBin; else nGet=BLOBBATCH; TotalGet+=nGet; memcpy(p,BinaryPtr,nGet); p+=nGet; } } Clear(); return TotalGet; } }