잘되던 DB연동이 갑자기 무조건 결과값을 1만 뱉어내고 나와버리네요 ;;;... 정보
잘되던 DB연동이 갑자기 무조건 결과값을 1만 뱉어내고 나와버리네요 ;;;...본문
기존에 잘되던 로그 생성 에이전트 파일이 있는데 무조건 쿼리 결과값(nNum의 값)을 1로만 뱉어내고 나와버립니다.
원래는 15969, 19839 머 이런 큰 숫자값이 나와야 정상이었거든요. 소스 파일 건든거 하나도 없고, 서버주소만 바뀌었을 뿐인데...(주소도 제대로 바뀐거 확인했고요. init 설정파일에도 주소값 제대로 설정되어서 DB접속도 잘 됩니다. 다른 데이터들이나 쿼리문들은 다 정상적으로 주고받고요. 요놈만 말썽이네요;...)
다음은 소스입니다.
while(true)
{
bzero(Query,sizeof(Query));
sprintf(Query," select i_num from %s where dt_indate < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL '-7' DAY), '%%Y-%%m-%%d 00:00:00') LIMIT 0, 100 ",_QUERY1_);
pDB->ExeQuery(Query);
pDB->StoreResult(&mrDataForRemove);
int nRows = mrDataForRemove.GetNumRows();
Print("Query : %s, Rows Count : %d",Query,nRows);
if(nRows <= 0) break;
for(int row=0;row < nRows;row++)
{
mrDataForRemove.FetchRow();
mrDataForRemove.GetData(1,nNum);
sprintf(Query," delete from %s where i_num = %d",_QUERY1_,nNum);
Print("DataRemove Query : %s", Query);
if(!pDB->ExeQuery(Query))
{
InsertErrorLog(Query);
bError = true;
break;
}
}
mrDataForRemove.FreeResult();
if(bError) break;
}
sleep(10);
기존에는 for문 안에서(nRows값은 현재 100입니다.) nNum의 숫자값만큼 반복문으로 다 뿌리고 나왔는데 무조건 mrDataForRemove.GetData(1,nNum); 이 함수에서 nNum 값이 1만 뿌리고는 반복문이 종료되는거 같습니다.
FetchRow()함수는
bool MysqlRes::FetchRow( )
{
if(!m_mysqlRes) return false;
m_mysqlRow = mysql_fetch_row(m_mysqlRes);
return true;
}
GetData함수는
bool MysqlRes::GetData( const int p_nIdx, int & p_nRetValue )
{
if(p_nIdx<1 || !m_mysqlRes) return false;
p_nRetValue = 0;
if(mysql_num_fields(m_mysqlRes)<p_nIdx) return false;
if(!m_mysqlRow[p_nIdx-1]) return false;
p_nRetValue = atoi(m_mysqlRow[p_nIdx-1]);
return true;
}
만약 쿼리문이 잘못되어 실행 실패라면 if(!pDB->ExeQuery(Query)) 이 루틴을 타고 들어가 에러로그파일에 값을 넣어야 하는데 에러로그 파일이 깨끗하고요. 도대체 뭐가 원인인지 잘 모르겠네요. ㅠ.ㅠ
원래는 15969, 19839 머 이런 큰 숫자값이 나와야 정상이었거든요. 소스 파일 건든거 하나도 없고, 서버주소만 바뀌었을 뿐인데...(주소도 제대로 바뀐거 확인했고요. init 설정파일에도 주소값 제대로 설정되어서 DB접속도 잘 됩니다. 다른 데이터들이나 쿼리문들은 다 정상적으로 주고받고요. 요놈만 말썽이네요;...)
다음은 소스입니다.
while(true)
{
bzero(Query,sizeof(Query));
sprintf(Query," select i_num from %s where dt_indate < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL '-7' DAY), '%%Y-%%m-%%d 00:00:00') LIMIT 0, 100 ",_QUERY1_);
pDB->ExeQuery(Query);
pDB->StoreResult(&mrDataForRemove);
int nRows = mrDataForRemove.GetNumRows();
Print("Query : %s, Rows Count : %d",Query,nRows);
if(nRows <= 0) break;
for(int row=0;row < nRows;row++)
{
mrDataForRemove.FetchRow();
mrDataForRemove.GetData(1,nNum);
sprintf(Query," delete from %s where i_num = %d",_QUERY1_,nNum);
Print("DataRemove Query : %s", Query);
if(!pDB->ExeQuery(Query))
{
InsertErrorLog(Query);
bError = true;
break;
}
}
mrDataForRemove.FreeResult();
if(bError) break;
}
sleep(10);
기존에는 for문 안에서(nRows값은 현재 100입니다.) nNum의 숫자값만큼 반복문으로 다 뿌리고 나왔는데 무조건 mrDataForRemove.GetData(1,nNum); 이 함수에서 nNum 값이 1만 뿌리고는 반복문이 종료되는거 같습니다.
FetchRow()함수는
bool MysqlRes::FetchRow( )
{
if(!m_mysqlRes) return false;
m_mysqlRow = mysql_fetch_row(m_mysqlRes);
return true;
}
GetData함수는
bool MysqlRes::GetData( const int p_nIdx, int & p_nRetValue )
{
if(p_nIdx<1 || !m_mysqlRes) return false;
p_nRetValue = 0;
if(mysql_num_fields(m_mysqlRes)<p_nIdx) return false;
if(!m_mysqlRow[p_nIdx-1]) return false;
p_nRetValue = atoi(m_mysqlRow[p_nIdx-1]);
return true;
}
만약 쿼리문이 잘못되어 실행 실패라면 if(!pDB->ExeQuery(Query)) 이 루틴을 타고 들어가 에러로그파일에 값을 넣어야 하는데 에러로그 파일이 깨끗하고요. 도대체 뭐가 원인인지 잘 모르겠네요. ㅠ.ㅠ
댓글 전체
select i_num from %s where dt_indate < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL '-7' DAY), '%%Y-%%m-%%d 00:00:00') LIMIT 0, 100
이부분에서 날리신 쿼리문을 테이블명 넣어서 db에 직접 입력해 보세요
이부분에서 날리신 쿼리문을 테이블명 넣어서 db에 직접 입력해 보세요