Quando si accede a un RDBMS, il ResultSet che si ottiene è in genere orientato alla riga. Vale a dire, ogni volta che chiami ResultSet::next(), il cursore si sposta sulla riga successiva. Ecco perché il tuo ciclo
for (int i = 0; i < columncount; i++)
{
while (res->next())
{
...
}
}
mostra solo il primo attributo.
Normalmente cambi loop interno ed esterno come
while (res->next())
{
for (int i = 0; i < columncount; i++)
{
...
}
}
Ma se hai davvero bisogno di accedere a una colonna alla volta, dovrai controllare se ResultSet ti consente di reimpostare il cursore sulla prima riga. In caso contrario, è necessario memorizzare nella cache i dati o eseguire la stessa query SQL più e più volte.