Al acceder a un RDBMS, el ResultSet que obtiene normalmente está orientado a filas. Es decir, cada vez que llama a ResultSet::next(), el cursor se mueve a la fila siguiente. Por eso tu bucle
for (int i = 0; i < columncount; i++)
{
while (res->next())
{
...
}
}
solo muestra el primer atributo.
Normalmente, cambia los bucles internos y externos como
while (res->next())
{
for (int i = 0; i < columncount; i++)
{
...
}
}
Pero si realmente necesita acceder a una columna a la vez, deberá verificar si ResultSet le permite restablecer el cursor a la primera fila. De lo contrario, debe almacenar en caché los datos o emitir la misma consulta SQL una y otra vez.