⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 updatableresultset.java

📁 在资料浩瀚的互联网中
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     *            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 + -