Итоговое число строк метода getRow - PullRequest
19 голосов
/ 25 сентября 2011

Прочитайте следующий код:

public class selectTable {

public static ResultSet rSet;
public static int total=0;
public static ResultSet onLoad_Opetations(Connection Conn, int rownum,String sql)
{
int rowNum=rownum;
int totalrec=0;
try
{
   Conn=ConnectionODBC.getConnection();
   Statement stmt = Conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);        
    String sqlStmt = sql;        
    rSet = stmt.executeQuery(sqlStmt);
    total = rSet.getRow();        
    }
    catch(Exception e)
    {
        System.out.println(e.getMessage());
    }
    System.out.println("Total Number of Records="+totalrec);
    return rSet;
    }

}

Следующий код не отображает фактическую сумму:

total = rSet.getRow();

мой jTable отображает 4 записи в jTable, но всего = 0; когда я оцениваю через отладку, он показывает:

total=(int)0; 

, а не всего = (int) 4 И если я использую

rSet=last(); above from the code  total = rSet.getRow();

тогда итоговое значение показывает точное значение = 4, но rSet ничего не возвращает. тогда jTable пуст. Обнови меня!

Ответы [ 9 ]

24 голосов
/ 25 сентября 2011

BalusC ответ правильный! но я должен упомянуть в соответствии с переменной экземпляра пользователя, такой как:

rSet.last(); 
total = rSet.getRow();

а потом чего вам не хватает

rSet.beforeFirst();

оставшийся код такой же, вы получите желаемый результат.

16 голосов
/ 25 сентября 2011

Вам нужно вызвать ResultSet#beforeFirst(), чтобы переместить курсор назад до первой строки, прежде чем вы вернете объект ResultSet. Таким образом, пользователь сможет использовать next() обычным способом.

resultSet.last();
rows = resultSet.getRow();
resultSet.beforeFirst();
return resultSet;

Тем не менее, у вас большие проблемы с приведенным кодом. Это утечка ресурсов БД, и это также не правильный подход ООП. Найдите шаблон DAO. В конечном итоге вы бы хотели получить

public List<Operations> list() throws SQLException {
    // Declare Connection, Statement, ResultSet, List<Operation>.

    try {
        // Use Connection, Statement, ResultSet.

        while (resultSet.next()) {
            // Add new Operation to list.
        }
    } finally {
        // Close ResultSet, Statement, Connection.
    }

    return list;
}

Таким образом, вызывающий абонент должен просто использовать List#size(), чтобы узнать о количестве записей.

3 голосов
/ 25 сентября 2011

Как ответили другие, нет способа получить количество строк без итерации до конца. Вы можете сделать это, но, возможно, не захотите, обратите внимание на следующие моменты:

  1. Для многих систем РСУБД ResultSet является потоковым API, это означает что он не загружает (или, возможно, даже не извлекает) все строки из сервер базы данных. См. этот вопрос о SO. Итерацией к конец ResultSet, вы можете значительно увеличить время, необходимое для выполнить в определенных случаях.

  2. По умолчанию ResultSet объект не обновляется и имеет курсор это только движение вперед. Я думаю, что это означает, что если вы выполнять запрос с ResultSet.TYPE_SCROLL_INSENSITIVE rSet.beforeFirst() скинет SQLException. Причина этого заключается в том, что есть стоимость с прокручиваемым курсором. Согласно документации, он может выдавать SQLFeatureNotSupportedException, даже если вы создаете прокручиваемый курсор.

  3. Заполнение и возврат List<Operations> означает, что вы будете Также нужна дополнительная память. Для очень больших наборов результатов это не Работа на все.

Так что большой вопрос в том, какие СУБД? В целом, я бы предложил не регистрировать количество записей.

2 голосов
/ 22 ноября 2016

Одним из лучших способов было бы использование SELECT COUNT оператора SQL.

Просто, когда вам нужно количество возвращенных строк, выполните другой запрос, возвращающий точное число результатов этого запроса.*

 try
{
   Conn=ConnectionODBC.getConnection();
   Statement stmt = Conn.createStatement();        
    String sqlStmt = sql;        
    String sqlrow = SELECT COUNT(*) from (sql) rowquery;
    String total = stmt.executeQuery(sqlrow);
    int rowcount = total.getInt(1);
    }
2 голосов
/ 25 сентября 2011

Метод getRow () извлекает номер текущей строки, а не количество строк.Поэтому перед началом итерации по ResultSet, getRow() возвращает 0.

Чтобы получить фактическое количество строк, возвращаемых после выполнения вашего запроса, не существует free метода: выдолжен перебрать его.

Тем не менее, если вам действительно необходимо получить общее количество строк перед их обработкой, вы можете:

  1. ResultSet.last ()
  2. ResultSet.getRow () для получения общего количества строк
  3. ResultSet.beforeFirst ()
  4. ПроцессResultSet обычно
0 голосов
/ 10 апреля 2017

Лучший способ получить количество строк из набора результатов - использовать функцию запроса count для доступа к базе данных, а затем метод rs.getInt (1) для получения количества строк.из моего кода посмотрите это:

    String query = "SELECT COUNT() FROM table";
ResultSet rs = new DatabaseConnection().selectData(query);
rs.getInt(1);

это вернет int значение числа строк, извлеченных из базы данных.Здесь DatabaseConnection (). SelectData () - мой код для доступа к базе данных.Я тоже застрял здесь, но потом решил ...

0 голосов
/ 16 апреля 2013

Я решил эту проблему.Единственное, что я делаю, это:

private int num_rows;

И затем в вашем методе, используя набор результатов, поместите этот код

while (this.rs.next())
{

    this.num_rows++;
}

Вот и все

0 голосов
/ 25 сентября 2011

Невозможно получить количество строк, возвращаемых в ResultSet, без итерации по нему.И почему вы должны вернуть ResultSet, не повторяя его?Во-первых, бессмысленно выполнять запрос.

Лучшим решением будет отделить постоянство от просмотра.Создайте отдельный объект доступа к данным, который обрабатывает все запросы к базе данных для вас.Пусть он получит значения, отображаемые в JTable, загрузит их в структуру данных и вернет их в пользовательский интерфейс для отображения.Пользовательский интерфейс будет иметь всю необходимую информацию.

0 голосов
/ 25 сентября 2011

Метод getRow() всегда выдаст 0 после запроса:

ResultSet.getRow ()

Извлекает текущий номер строки.

Во-вторых, вы выводите totalrec, но никогда ничего ему не назначаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...