Ao acessar um RDBMS, o ResultSet que você obtém normalmente é orientado a linhas. Ou seja, sempre que você chama ResultSet::next(), o cursor se move para a próxima linha. É por isso que seu laço
for (int i = 0; i < columncount; i++)
{
while (res->next())
{
...
}
}
está mostrando apenas o primeiro atributo.
Normalmente você alterna loops internos e externos, como
while (res->next())
{
for (int i = 0; i < columncount; i++)
{
...
}
}
Mas se você realmente precisar acessar uma coluna por vez, terá que verificar se o ResultSet permite redefinir o cursor para a primeira linha. Caso contrário, você precisa armazenar os dados em cache ou emitir a mesma consulta SQL repetidamente.