Общее количество результатов для метода getRow

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

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;
    }

}

Следующий код dos't показывает фактическое общее количество:

total = rSet.getRow();

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

total=(int)0; 

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

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

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

Ответ 1

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

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

а затем, который вам не хватает

rSet.beforeFirst();

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

Ответ 2

Вам нужно вызвать 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

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

Лучше всего было бы использовать инструкцию 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);
    }

Ответ 6

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

ResultSet.getRow()

Извлекает номер строки current.

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

Ответ 7

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

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

Ответ 8

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

private int num_rows;

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

while (this.rs.next())
{

    this.num_rows++;
}

Что все

Ответ 9

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

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

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