2016-10-25 5 views
0

MySQL C++ 커넥터를 사용하고 있고 다음과 같은 방식으로 결과 집합을 반복하려고합니다. 응용 프로그램은 데이터 형식에 의존하지 않고 모든 열을 반복해야합니다. 코드는 데이터 형식을 catch 한 다음 처리해야합니다. 문제는 내가 테스트하고있는 테이블에 16 개의 열이 있지만 첫 번째 코드 만 통과한다는 것입니다.결과 집합 루핑

try 
{    
    driver = get_driver_instance(); 
    con = driver->connect(connectionString, str_username, str_password); 
    con->setSchema(str_schema); 
    stmt = con->createStatement(); 
    res = stmt->executeQuery(selectquery); 
    res_meta = res->getMetaData(); 

    string datatype; 
    int columncount = res_meta->getColumnCount(); 

    for (int i = 0; i < columncount; i++) 
    {     
    while (res->next()) 
    datatype = res_meta->getColumnTypeName(i + 1); 
    { 
     if(datatype == "INT") 
     { 
     switch (res_meta->getColumnDisplaySize(i + 1)) 
     { 
      case 64: 
       break; 
      case 32: 
       break; 
      default: 
       break; 
     } 
     } 
    }  
} 
catch(sql::SQLException &e){} 
+0

코드를 디버그하려고하면 columncount를 살펴보십시오 – duDE

+0

외부 'for'에서 'res'를 재설정하지 않으므로 1 개의 결과 만있는 경우 while은 한 번 실행 한 다음 다른 for 루프 반복을 실행합니다 그것은 아무 것도하지 않을 것이다. –

답변

0

RDBMS에 액세스 할 때 얻을 수있는 ResultSet은 일반적으로 행 지향입니다. 즉, ResultSet :: next()를 호출 할 때마다 커서가 다음 행으로 이동합니다. 그래서 귀하의 루프

for (int i = 0; i < columncount; i++) 
{     
    while (res->next()) 
    { 
     ... 
    } 
} 

은 첫 번째 속성 만 보여줍니다.

일반적으로 당신은 당신이 정말로 한 번에 하나의 컬럼에 액세스해야하는 경우의 ResultSet을 사용하면 커서를 재설정 할 수 있습니다 경우에, 당신은 확인해야합니다 같은

while (res->next()) 
{ 
    for (int i = 0; i < columncount; i++) 
    { 
     ... 
    } 
} 

으로 내부 및 외부 루프를 전환 첫번째 줄. 그렇지 않다면 데이터를 캐시하거나 동일한 SQL 쿼리를 반복해서 발행해야합니다.

+0

감사합니다. 제게는 테이블의 모든 셀 (데이터 포함)을 반복해야합니다. 이것이 어떤 순서로 이루어 졌는지는 중요하지 않습니다. – Pim