2013-07-21 1 views
2

Я использую Firebird. Я узнал, что в Firebird мы не можем перемещать верхушку результата. Он поддерживается только TYPE_FORWARD_ONLY, а TYPE_SCROLL_INSENSITIVE еще не поддерживается. В моем приложении я хочу переместить указатель результатов на одну строку назад, используя этот resultSet.previous(). Я хочу знать, есть ли способ переместить курсор назад.Переместить ResultSet курсор назад в Firebird

Посмотрите эту документацию Firebird:

JDBC 3.0 спецификация определяет три типа наборов результатов

  • TYPE_FORWARD_ONLY: набор результатов не прокручивать, курсор может двигаться только вперед. Когда используется уровень изоляции TRANSACTION_READ_COMMITTED, набор результатов вернет все строки, удовлетворяющие условию поиска, в момент вызова ResultSet.next() в . В других случаях набор результатов вернет только строк, которые были видны в момент начала транзакции.
  • TYPE_SCROLL_INSENSITIVE: результирующий набор прокручивается, курсор может перемещаться назад и вперед, может быть расположен в указанной строке. Видимы только строки, удовлетворяющие условию во время выполнения запроса.
  • TYPE_SCROLL_SENSITIVE: не поддерживается Firebird и Jaybird. Драйвер позволяет приложению запрашивать этот тип результирующего набора, однако в соответствии со спецификацией JDBC тип «понижен» до предыдущего типа и соответствующее сообщение добавляется к объекту соединения.

Из-за отсутствующей поддержку прокрутки курсоров в Firebird, их поддержка (TYPE_SCROLL_INSENSITIVE результирующего набор типа) осуществляется путем выборки полного набора результатов клиента. Прокрутка происходит в памяти на клиенте. Это может отрицательно сказаться на использовании системной памяти и производительности при большом наборе результатов.

Это только один кусок кода, я думаю, что было бы полезно:

while (res.next()) { 
    if (!id.equalsIgnoreCase(res.getString("NO_TRANSFERT"))) { 
     res.previous(); 
     break; 
    } 
    xml = xml + "<" + tableName + ">\n"; 
    for (int i = 1; i <= count; i++) { 
     String columnName = rsmd.getColumnName(i); 
     xml = xml + "<" + columnName + ">" + res.getString(i) + "</" 
      + columnName + ">\n"; 
    } 
    xml = xml + "</" + tableName + ">\n\n"; 
} 

Из чата, код, используемый для создания Statement является:

public static ResultSet selectAll(String table) throws SQLException { 
    String query = "SELECT * FROM " + table; 
    PreparedStatement ps = connection.prepareStatement(query); 
    ResultSet res = ps.executeQuery(); 
    return res; 
} 
+1

Jaybird поддерживает 'TYPE_SCROLL_SENSITIVE', покажет код, в котором вы создаете' Statement' и 'ResultSet'. –

+0

есть разница между firebird и jaybird? – tbodt

+0

@tbodt Jaybird - это драйвер JDBC для Firebird –

ответ

4

При создании a Statement (или PreparedStatement), вам нужно указать тип набора результатов, если вы не используете драйвер по умолчанию (TYPE_FORWARD_ONLY).

Таким образом, чтобы прокручивать ResultSet, вам нужно использовать

PreparedStatement ps = connection.prepareStatement(query, 
      ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 

Смотрите Javadoc из Connection.prepareStatement(sql, resultSetType, resultSetConcurrency).

Также имейте в виду, что ваш текущий код пропускает ресурсы. Вы создаете метод PreparedStatement в методе и никогда не закрываете его. Возможно, вы захотите перестроить свой код, чтобы закрыть оператор и результирующий набор в том же месте.Закрытие заявления в его текущем месте не будет работать, так как это также закроет ResultSet, прежде чем вы сможете его использовать.

Раскрытие информации: Я являюсь разработчиком JDBC-драйвера Jaybird.