2016-10-25 19 views
0

私はMySQL C++コネクタを使用していますが、次のように結果セットを繰り返し処理しようとしています。アプリケーションはデータ型によらずすべての列を反復処理する必要があります。コードはデータ型をキャッチし、次に処理を続行する必要があります。問題は、私がテストしているテーブルに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()) 
    { 
     ... 
    } 
} 

は、最初の属性のみを表示しています。

通常、あなたがそのような

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

として、内側と外側のループを切り替えるしかし、あなたが本当に一度に一つの列にアクセスする必要がある場合、あなたがResultSetにカーソルをリセットすることができますかどうかを確認する必要があります最初の行そうでない場合は、データをキャッシュするか、同じSQLクエリを何度も発行する必要があります。

+0

ありがとう、私のためには、テーブルのすべてのセル(データ付き)を反復する必要があります。どの順番でこれが行われるかは関係ありません。 – Pim

関連する問題