📄 updatableresultset.java
字号:
* type is TYPE_FORWARD_ONLY. */ public synchronized boolean first() throws SQLException { return super.first(); } /** * JDBC 2.0 Insert the contents of the insert row into the result set and * the database. Must be on the insert row when this method is called. * * @exception SQLException if a database-access error occurs, if called * when not on the insert row, or if all non-nullable columns * in the insert row have not been given a value */ public synchronized void insertRow() throws SQLException { checkClosed(); if (!this.onInsertRow) { throw new SQLException(Messages.getString("UpdatableResultSet.7")); //$NON-NLS-1$ } this.inserter.executeUpdate(); int numPrimaryKeys = 0; if (this.primaryKeyIndicies != null) { numPrimaryKeys = this.primaryKeyIndicies.size(); } long autoIncrementId = this.inserter.getLastInsertID(); int numFields = this.fields.length; byte[][] newRow = new byte[numFields][]; for (int i = 0; i < numFields; i++) { if (this.inserter.isNull(i)) { newRow[i] = null; } else { newRow[i] = this.inserter.getBytesRepresentation(i); } if ((numPrimaryKeys == 1) && this.fields[i].isPrimaryKey() && (autoIncrementId > 0)) { newRow[i] = String.valueOf(autoIncrementId).getBytes(); } } this.rowData.addRow(newRow); resetInserter(); } /** * JDBC 2.0 * * <p> * Moves to the last row in the result set. * </p> * * @return true if on a valid row, false if no rows in the result set. * * @exception SQLException if a database-access error occurs, or result set * type is TYPE_FORWARD_ONLY. */ public synchronized boolean last() throws SQLException { return super.last(); } /** * JDBC 2.0 Move the cursor to the remembered cursor position, usually the * current row. Has no effect unless the cursor is on the insert row. * * @exception SQLException if a database-access error occurs, or the result * set is not updatable * @throws SQLException if the ResultSet is not updatable or some other * error occurs */ public synchronized void moveToCurrentRow() throws SQLException { checkClosed(); if (!this.isUpdatable) { throw new NotUpdatable(); } this.onInsertRow = false; } /** * JDBC 2.0 Move to the insert row. The current cursor position is * remembered while the cursor is positioned on the insert row. The insert * row is a special row associated with an updatable result set. It is * essentially a buffer where a new row may be constructed by calling the * updateXXX() methods prior to inserting the row into the result set. * Only the updateXXX(), getXXX(), and insertRow() methods may be called * when the cursor is on the insert row. All of the columns in a result * set must be given a value each time this method is called before * calling insertRow(). UpdateXXX()must be called before getXXX() on a * column. * * @exception SQLException if a database-access error occurs, or the result * set is not updatable * @throws NotUpdatable DOCUMENT ME! */ public synchronized void moveToInsertRow() throws SQLException { checkClosed(); if (!this.isUpdatable) { throw new NotUpdatable(); } if (this.inserter == null) { if (this.insertSQL == null) { generateStatements(); } this.inserter = this.connection.clientPrepareStatement(this.insertSQL); extractDefaultValues(); resetInserter(); } else { resetInserter(); } int numFields = this.fields.length; this.thisRow = new byte[numFields][]; this.onInsertRow = true; this.doingUpdates = false; for (int i = 0; i < numFields; i++) { if (this.defaultColumnValue[i] != null) { this.inserter.setBytes(i + 1, this.defaultColumnValue[i]); // This value _could_ be changed from a getBytes(), so we // need a copy.... byte[] defaultValueCopy = new byte[this.defaultColumnValue[i].length]; System.arraycopy(this.defaultColumnValue[i], 0, defaultValueCopy, 0, defaultValueCopy.length); this.thisRow[i] = defaultValueCopy; } else { this.inserter.setNull(i + 1, java.sql.Types.NULL); this.thisRow[i] = null; } } } /** * A ResultSet is initially positioned before its first row, the first call * to next makes the first row the current row; the second call makes the * second row the current row, etc. * * <p> * If an input stream from the previous row is open, it is implicitly * closed. The ResultSet's warning chain is cleared when a new row is * read * </p> * * @return true if the new current is valid; false if there are no more * rows * * @exception SQLException if a database access error occurs */ public synchronized boolean next() throws SQLException { return super.next(); } /** * The prev method is not part of JDBC, but because of the architecture of * this driver it is possible to move both forward and backward within the * result set. * * <p> * If an input stream from the previous row is open, it is implicitly * closed. The ResultSet's warning chain is cleared when a new row is * read * </p> * * @return true if the new current is valid; false if there are no more * rows * * @exception SQLException if a database access error occurs */ public synchronized boolean prev() throws SQLException { return super.prev(); } /** * JDBC 2.0 * * <p> * Moves to the previous row in the result set. * </p> * * <p> * Note: previous() is not the same as relative(-1) since it makes sense to * call previous() when there is no current row. * </p> * * @return true if on a valid row, false if off the result set. * * @exception SQLException if a database-access error occurs, or result set * type is TYPE_FORWAR_DONLY. */ public synchronized boolean previous() throws SQLException { return super.previous(); } /** * JDBC 2.0 Refresh the value of the current row with its current value in * the database. Cannot be called when on the insert row. The * refreshRow() method provides a way for an application to explicitly * tell the JDBC driver to refetch a row(s) from the database. An * application may want to call refreshRow() when caching or prefetching * is being done by the JDBC driver to fetch the latest value of a row * from the database. The JDBC driver may actually refresh multiple rows * at once if the fetch size is greater than one. All values are * refetched subject to the transaction isolation level and cursor * sensitivity. If refreshRow() is called after calling updateXXX(), but * before calling updateRow() then the updates made to the row are lost. * Calling refreshRow() frequently will likely slow performance. * * @exception SQLException if a database-access error occurs, or if called * when on the insert row. * @throws NotUpdatable DOCUMENT ME! */ public synchronized void refreshRow() throws SQLException { checkClosed(); if (!this.isUpdatable) { throw new NotUpdatable(); } if (this.onInsertRow) { throw new SQLException(Messages.getString("UpdatableResultSet.8")); //$NON-NLS-1$ } else if (this.rowData.size() == 0) { throw new SQLException(Messages.getString("UpdatableResultSet.9")); //$NON-NLS-1$ } else if (isBeforeFirst()) { throw new SQLException(Messages.getString("UpdatableResultSet.10")); //$NON-NLS-1$ } else if (isAfterLast()) { throw new SQLException(Messages.getString("UpdatableResultSet.11")); //$NON-NLS-1$ } if (this.refresher == null) { if (this.refreshSQL == null) { generateStatements(); } this.refresher = this.connection.clientPrepareStatement(this.refreshSQL); } this.refresher.clearParameters(); int numKeys = this.primaryKeyIndicies.size(); if (numKeys == 1) { byte[] dataFrom = null; int index = ((Integer) this.primaryKeyIndicies.get(0)).intValue(); if (!this.doingUpdates) { dataFrom = (byte[]) this.thisRow[index]; } else { dataFrom = this.updater.getBytesRepresentation(index); // Primary keys not set? if (this.updater.isNull(index) || (dataFrom.length == 0)) { dataFrom = (byte[]) this.thisRow[index]; } else { dataFrom = stripBinaryPrefix(dataFrom); } } this.refresher.setBytesNoEscape(1, dataFrom); } else { for (int i = 0; i < numKeys; i++) { byte[] dataFrom = null; int index = ((Integer) this.primaryKeyIndicies.get(i)).intValue(); if (!this.doingUpdates) { dataFrom = (byte[]) this.thisRow[index]; } else { dataFrom = this.updater.getBytesRepresentation(index); // Primary keys not set? if (this.updater.isNull(index) || (dataFrom.length == 0)) { dataFrom = (byte[]) this.thisRow[index]; } else { dataFrom = stripBinaryPrefix(dataFrom); } } this.refresher.setBytesNoEscape(i + 1, dataFrom); } } java.sql.ResultSet rs = null; try { rs = this.refresher.executeQuery(); int numCols = rs.getMetaData().getColumnCount(); if (rs.next()) { for (int i = 0; i < numCols; i++) { byte[] val = rs.getBytes(i + 1); if ((val == null) || rs.wasNull()) { this.thisRow[i] = null; } else { this.thisRow[i] = rs.getBytes(i + 1); } } } else { throw new SQLException(Messages.getString( "UpdatableResultSet.12"), //$NON-NLS-1$ SQLError.SQL_STATE_GENERAL_ERROR); //$NON-NLS-1$ } } finally { if (rs != null) { try { rs.close(); } catch (SQLException ex) { ; // ignore } } } } private byte[] stripBinaryPrefix(byte[] dataFrom) { return StringUtils.stripEnclosure(dataFrom, "_binary'", "'"); } /** * JDBC 2.0 * * <p> * Moves a relative number of rows, either positive or negative. Attempting * to move beyond the first/last row in the result set positions the * cursor before/after the the first/last row. Calling relative(0) is * valid, but does not change the cursor position. * </p> * * <p> * Note: Calling relative(1) is different than calling next() since is * makes sense to call next() when there is no current row, for example, * when the cursor is positioned before the first row or after the last * row of the result set. * </p> * * @param rows DOCUMENT ME! * * @return true if on a row, false otherwise. * * @exception SQLException if a database-access error occurs, or there is * no current row, or result set type is TYPE_FORWARD_ONLY. */ public synchronized boolean relative(int rows) throws SQLException { return super.relative(rows); } /** * JDBC 2.0 Determine if this row has been deleted. A deleted row may * leave a visible "hole" in a result set. This method can be used to * detect holes in a result set. The value returned depends on whether or * not the result set can detect deletions. * * @return true if deleted and deletes are detected * * @exception SQLException if a database-access error occurs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -