JDBC ResultSet ведет себя странно - PullRequest
1 голос
/ 19 августа 2011

Я попадаю в свою базу данных и получаю ResultSet, который сообщает мне, что текущая строка # равна 2, с вызовом getRow (), но он не зацикливается при вызове метода next ():

// Doesn't even loop once; fails on initial next() call -- entire loop skipped
try
{
    ResultSet oResults = executeSQL("SELECT * FROM widgets");

    // Returns a value of 2
    int iRowCount = oResults.getRow();

    if(iRowCount == 0)
        return;

    while(oResults.next())
    {
        // Never gets executed
    }

    // This gets executed though, and all the way down...
    // ...
}
catch(Exception e) { handleException(e); }

Я потратил почти час этим утром, пытаясь выяснить, что происходит, но это буквальный код, который я пытаюсь выполнить (это проект test / sandbox, поэтому он может не сделать логическим смысл).Это когда-нибудь случалось с кем-нибудь?

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

Стандартные библиотеки JDBC возвращают ResultSet, который не имеет никакого представления о том, сколько в нем строк. Если ваша реализация executeSQL не возвращает CachedRowSet (который по существу предварительно прокрутил набор результатов и загрузил все строки в память), вы никогда не узнаете количество строк, пока не достигнете конца, когда oResults.next () возвращает false.

Таким образом, ваша попытка управления потоком программ путем проверки количества строк никогда не сработает.

Далее, ваш вызов ResultSet.getRow () также, вероятно, бесполезен. Вот что говорит Javadoc:

Извлекает номер текущей строки. Первая строка - это номер 1, вторая - номер 2 и т. Д.
Примечание. Поддержка метода getRow является необязательной для ResultSets с типом набора результатов TYPE_FORWARD_ONLY

Большинство реализаций из драйверов JDBC предназначены только для пересылки (то есть вы не можете прокручивать назад с помощью метода previous () ), поэтому результат getRow(), вероятно, бесполезен.

Вот как должен выглядеть ваш код:

ResultSet oResults = executeSQL("SELECT * FROM widgets");

while(oResults.next())
{
    // Process rows
}

Если вы все еще не входите в цикл while, это означает, что ваш запрос не возвращает строк - другого объяснения нет. Если получение строк не является «невозможным», то я предлагаю вам проверить параметры подключения, чтобы убедиться, что вы подключаетесь к правильной базе данных (а не к localhost, например).

1 голос
/ 19 августа 2011

Метод getRow () позволяет проверить номер строки, в которой в данный момент находится курсор, поэтому вызов next () находится вне диапазона вашего набора результатов. Попробуйте установить oResults.absolute(0); после установки iRowCount.

...