Example #1
0
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;
}
Example #2
0
// 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;
	}
}
Example #3
0
// 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;
	}
}