Общее количество результатов для метода 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() - мой код для доступа к базе данных.
Я тоже застрял здесь, но потом решил...