1 /*
   2  * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.rowset;
  27 
  28 import java.sql.*;
  29 import javax.sql.*;
  30 import javax.naming.*;
  31 import java.io.*;
  32 import java.math.*;
  33 import java.util.*;
  34 
  35 import javax.sql.rowset.*;
  36 
  37 /**
  38  * The standard implementation of the <code>JdbcRowSet</code> interface. See the interface
  39  * definition for full behavior and implementation requirements.
  40  *
  41  * @author Jonathan Bruce, Amit Handa
  42  */
  43 
  44 public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
  45 
  46     /**
  47      * The <code>Connection</code> object that is this rowset's
  48      * current connection to the database.  This field is set
  49      * internally when the connection is established.
  50      */
  51     private Connection conn;
  52 
  53     /**
  54      * The <code>PreparedStatement</code> object that is this rowset's
  55      * current command.  This field is set internally when the method
  56      * <code>execute</code> creates the <code>PreparedStatement</code>
  57      * object.
  58      */
  59     private PreparedStatement ps;
  60 
  61     /**
  62      * The <code>ResultSet</code> object that is this rowset's
  63      * current result set.  This field is set internally when the method
  64      * <code>execute</code> executes the rowset's command and thereby
  65      * creates the rowset's <code>ResultSet</code> object.
  66      */
  67     private ResultSet rs;
  68 
  69     /**
  70      * The <code>RowSetMetaDataImpl</code> object that is constructed when
  71      * a <code>ResultSet</code> object is passed to the <code>JdbcRowSet</code>
  72      * constructor. This helps in constructing all metadata associated
  73      * with the <code>ResultSet</code> object using the setter methods of
  74      * <code>RowSetMetaDataImpl</code>.
  75      */
  76     private RowSetMetaDataImpl rowsMD;
  77 
  78     /**
  79      * The <code>ResultSetMetaData</code> object from which this
  80      * <code>RowSetMetaDataImpl</code> is formed and which  helps in getting
  81      * the metadata information.
  82      */
  83     private ResultSetMetaData resMD;
  84 
  85 
  86     /**
  87      * The Vector holding the Match Columns
  88      */
  89     private Vector<Integer> iMatchColumns;
  90 
  91     /**
  92      * The Vector that will hold the Match Column names.
  93      */
  94     private Vector<String> strMatchColumns;
  95 
  96 
  97     protected transient JdbcRowSetResourceBundle resBundle;
  98 
  99     /**
 100      * Constructs a default <code>JdbcRowSet</code> object.
 101      * The new instance of <code>JdbcRowSet</code> will serve as a proxy
 102      * for the <code>ResultSet</code> object it creates, and by so doing,
 103      * it will make it possible to use the result set as a JavaBeans
 104      * component.
 105      * <P>
 106      * The following is true of a default <code>JdbcRowSet</code> instance:
 107      * <UL>
 108      *   <LI>Does not show deleted rows
 109      *   <LI>Has no time limit for how long a driver may take to
 110      *       execute the rowset's command
 111      *   <LI>Has no limit for the number of rows it may contain
 112      *   <LI>Has no limit for the number of bytes a column may contain
 113      *   <LI>Has a scrollable cursor and does not show changes
 114      *       made by others
 115      *   <LI>Will not see uncommitted data (make "dirty" reads)
 116      *   <LI>Has escape processing turned on
 117      *   <LI>Has its connection's type map set to <code>null</code>
 118      *   <LI>Has an empty <code>Hashtable</code> object for storing any
 119      *       parameters that are set
 120      * </UL>
 121      * A newly created <code>JdbcRowSet</code> object must have its
 122      * <code>execute</code> method invoked before other public methods
 123      * are called on it; otherwise, such method calls will cause an
 124      * exception to be thrown.
 125      *
 126      * @throws SQLException [1] if any of its public methods are called prior
 127      * to calling the <code>execute</code> method; [2] if invalid JDBC driver
 128      * properties are set or [3] if no connection to a data source exists.
 129      */
 130     public JdbcRowSetImpl() {
 131         conn = null;
 132         ps   = null;
 133         rs   = null;
 134 
 135         try {
 136            resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
 137         } catch(IOException ioe) {
 138             throw new RuntimeException(ioe);
 139         }
 140 
 141 
 142         initParams();
 143 
 144         // set the defaults
 145 
 146         try {
 147             setShowDeleted(false);
 148         } catch(SQLException sqle) {
 149              System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setshowdeleted").toString() +
 150                                 sqle.getLocalizedMessage());
 151         }
 152 
 153         try {
 154             setQueryTimeout(0);
 155         } catch(SQLException sqle) {
 156             System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setquerytimeout").toString() +
 157                                 sqle.getLocalizedMessage());
 158         }
 159 
 160         try {
 161             setMaxRows(0);
 162         } catch(SQLException sqle) {
 163             System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setmaxrows").toString() +
 164                                 sqle.getLocalizedMessage());
 165         }
 166 
 167         try {
 168             setMaxFieldSize(0);
 169         } catch(SQLException sqle) {
 170              System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setmaxfieldsize").toString() +
 171                                 sqle.getLocalizedMessage());
 172         }
 173 
 174         try {
 175             setEscapeProcessing(true);
 176         } catch(SQLException sqle) {
 177              System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setescapeprocessing").toString() +
 178                                 sqle.getLocalizedMessage());
 179         }
 180 
 181         try {
 182             setConcurrency(ResultSet.CONCUR_UPDATABLE);
 183         } catch (SQLException sqle) {
 184             System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setconcurrency").toString() +
 185                                 sqle.getLocalizedMessage());
 186         }
 187 
 188         setTypeMap(null);
 189 
 190         try {
 191             setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
 192         } catch(SQLException sqle){
 193           System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.settype").toString() +
 194                                 sqle.getLocalizedMessage());
 195         }
 196 
 197         setReadOnly(true);
 198 
 199         try {
 200             setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
 201         } catch(SQLException sqle){
 202             System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.settransactionisolation").toString() +
 203                                 sqle.getLocalizedMessage());
 204         }
 205 
 206         //Instantiating the vector for MatchColumns
 207 
 208         iMatchColumns = new Vector<Integer>(10);
 209         for(int i = 0; i < 10 ; i++) {
 210            iMatchColumns.add(i,Integer.valueOf(-1));
 211         }
 212 
 213         strMatchColumns = new Vector<String>(10);
 214         for(int j = 0; j < 10; j++) {
 215            strMatchColumns.add(j,null);
 216         }
 217     }
 218 
 219     /**
 220      * Constructs a default <code>JdbcRowSet</code> object given a
 221      * valid <code>Connection</code> object. The new
 222      * instance of <code>JdbcRowSet</code> will serve as a proxy for
 223      * the <code>ResultSet</code> object it creates, and by so doing,
 224      * it will make it possible to use the result set as a JavaBeans
 225      * component.
 226      * <P>
 227      * The following is true of a default <code>JdbcRowSet</code> instance:
 228      * <UL>
 229      *   <LI>Does not show deleted rows
 230      *   <LI>Has no time limit for how long a driver may take to
 231      *       execute the rowset's command
 232      *   <LI>Has no limit for the number of rows it may contain
 233      *   <LI>Has no limit for the number of bytes a column may contain
 234      *   <LI>Has a scrollable cursor and does not show changes
 235      *       made by others
 236      *   <LI>Will not see uncommitted data (make "dirty" reads)
 237      *   <LI>Has escape processing turned on
 238      *   <LI>Has its connection's type map set to <code>null</code>
 239      *   <LI>Has an empty <code>Hashtable</code> object for storing any
 240      *       parameters that are set
 241      * </UL>
 242      * A newly created <code>JdbcRowSet</code> object must have its
 243      * <code>execute</code> method invoked before other public methods
 244      * are called on it; otherwise, such method calls will cause an
 245      * exception to be thrown.
 246      *
 247      * @throws SQLException [1] if any of its public methods are called prior
 248      * to calling the <code>execute</code> method, [2] if invalid JDBC driver
 249      * properties are set, or [3] if no connection to a data source exists.
 250      */
 251     public JdbcRowSetImpl(Connection con) throws SQLException {
 252 
 253         conn = con;
 254         ps = null;
 255         rs = null;
 256 
 257         try {
 258            resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
 259         } catch(IOException ioe) {
 260             throw new RuntimeException(ioe);
 261         }
 262 
 263 
 264         initParams();
 265         // set the defaults
 266         setShowDeleted(false);
 267         setQueryTimeout(0);
 268         setMaxRows(0);
 269         setMaxFieldSize(0);
 270 
 271         setParams();
 272 
 273         setReadOnly(true);
 274         setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
 275         setEscapeProcessing(true);
 276         setTypeMap(null);
 277 
 278         //Instantiating the vector for MatchColumns
 279 
 280         iMatchColumns = new Vector<Integer>(10);
 281         for(int i = 0; i < 10 ; i++) {
 282            iMatchColumns.add(i,Integer.valueOf(-1));
 283         }
 284 
 285         strMatchColumns = new Vector<String>(10);
 286         for(int j = 0; j < 10; j++) {
 287            strMatchColumns.add(j,null);
 288         }
 289     }
 290 
 291     /**
 292      * Constructs a default <code>JdbcRowSet</code> object using the
 293      * URL, username, and password arguments supplied. The new
 294      * instance of <code>JdbcRowSet</code> will serve as a proxy for
 295      * the <code>ResultSet</code> object it creates, and by so doing,
 296      * it will make it possible to use the result set as a JavaBeans
 297      * component.
 298      *
 299      * <P>
 300      * The following is true of a default <code>JdbcRowSet</code> instance:
 301      * <UL>
 302      *   <LI>Does not show deleted rows
 303      *   <LI>Has no time limit for how long a driver may take to
 304      *       execute the rowset's command
 305      *   <LI>Has no limit for the number of rows it may contain
 306      *   <LI>Has no limit for the number of bytes a column may contain
 307      *   <LI>Has a scrollable cursor and does not show changes
 308      *       made by others
 309      *   <LI>Will not see uncommitted data (make "dirty" reads)
 310      *   <LI>Has escape processing turned on
 311      *   <LI>Has its connection's type map set to <code>null</code>
 312      *   <LI>Has an empty <code>Hashtable</code> object for storing any
 313      *       parameters that are set
 314      * </UL>
 315      *
 316      * @param url - a JDBC URL for the database to which this <code>JdbcRowSet</code>
 317      *        object will be connected. The form for a JDBC URL is
 318      *        <code>jdbc:subprotocol:subname</code>.
 319      * @param user - the database user on whose behalf the connection
 320      *        is being made
 321      * @param password - the user's password
 322      *
 323      * @throws SQLException if a database access error occurs
 324      *
 325      */
 326     public JdbcRowSetImpl(String url, String user, String password) throws SQLException {
 327         conn = null;
 328         ps = null;
 329         rs = null;
 330 
 331         try {
 332            resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
 333         } catch(IOException ioe) {
 334             throw new RuntimeException(ioe);
 335         }
 336 
 337 
 338         initParams();
 339 
 340         // Pass the arguments to BaseRowSet
 341         // setter methods now.
 342 
 343         setUsername(user);
 344         setPassword(password);
 345         setUrl(url);
 346 
 347         // set the defaults
 348         setShowDeleted(false);
 349         setQueryTimeout(0);
 350         setMaxRows(0);
 351         setMaxFieldSize(0);
 352 
 353         setParams();
 354 
 355         setReadOnly(true);
 356         setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
 357         setEscapeProcessing(true);
 358         setTypeMap(null);
 359 
 360         //Instantiating the vector for MatchColumns
 361 
 362         iMatchColumns = new Vector<Integer>(10);
 363         for(int i = 0; i < 10 ; i++) {
 364            iMatchColumns.add(i,Integer.valueOf(-1));
 365         }
 366 
 367         strMatchColumns = new Vector<String>(10);
 368         for(int j = 0; j < 10; j++) {
 369            strMatchColumns.add(j,null);
 370         }
 371     }
 372 
 373 
 374     /**
 375      * Constructs a <code>JdbcRowSet</code> object using the given valid
 376      * <code>ResultSet</code> object. The new
 377      * instance of <code>JdbcRowSet</code> will serve as a proxy for
 378      * the <code>ResultSet</code> object, and by so doing,
 379      * it will make it possible to use the result set as a JavaBeans
 380      * component.
 381      *
 382      * <P>
 383      * The following is true of a default <code>JdbcRowSet</code> instance:
 384      * <UL>
 385      *   <LI>Does not show deleted rows
 386      *   <LI>Has no time limit for how long a driver may take to
 387      *       execute the rowset's command
 388      *   <LI>Has no limit for the number of rows it may contain
 389      *   <LI>Has no limit for the number of bytes a column may contain
 390      *   <LI>Has a scrollable cursor and does not show changes
 391      *       made by others
 392      *   <LI>Will not see uncommitted data (make "dirty" reads)
 393      *   <LI>Has escape processing turned on
 394      *   <LI>Has its connection's type map set to <code>null</code>
 395      *   <LI>Has an empty <code>Hashtable</code> object for storing any
 396      *       parameters that are set
 397      * </UL>
 398      *
 399      * @param res a valid <code>ResultSet</code> object
 400      *
 401      * @throws SQLException if a database access occurs due to a non
 402      * valid ResultSet handle.
 403      */
 404     public JdbcRowSetImpl(ResultSet res) throws SQLException {
 405 
 406         // A ResultSet handle encapsulates a connection handle.
 407         // But there is no way we can retrieve a Connection handle
 408         // from a ResultSet object.
 409         // So to avoid any anomalies we keep the conn = null
 410         // The passed rs handle will be a wrapper around for
 411         // "this" object's all operations.
 412         conn = null;
 413 
 414         ps = null;
 415 
 416         rs = res;
 417 
 418         try {
 419            resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
 420         } catch(IOException ioe) {
 421             throw new RuntimeException(ioe);
 422         }
 423 
 424 
 425         initParams();
 426 
 427         // get the values from the resultset handle.
 428         setShowDeleted(false);
 429         setQueryTimeout(0);
 430         setMaxRows(0);
 431         setMaxFieldSize(0);
 432 
 433         setParams();
 434 
 435         setReadOnly(true);
 436         setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
 437         setEscapeProcessing(true);
 438         setTypeMap(null);
 439 
 440         // Get a handle to ResultSetMetaData
 441         // Construct RowSetMetaData out of it.
 442 
 443         resMD = rs.getMetaData();
 444 
 445         rowsMD = new RowSetMetaDataImpl();
 446 
 447         initMetaData(rowsMD, resMD);
 448 
 449         //Instantiating the vector for MatchColumns
 450 
 451         iMatchColumns = new Vector<Integer>(10);
 452         for(int i = 0; i < 10 ; i++) {
 453            iMatchColumns.add(i,Integer.valueOf(-1));
 454         }
 455 
 456         strMatchColumns = new Vector<String>(10);
 457         for(int j = 0; j < 10; j++) {
 458            strMatchColumns.add(j,null);
 459         }
 460     }
 461 
 462     /**
 463      * Initializes the given <code>RowSetMetaData</code> object with the values
 464      * in the given <code>ResultSetMetaData</code> object.
 465      *
 466      * @param md the <code>RowSetMetaData</code> object for this
 467      *           <code>JdbcRowSetImpl</code> object, which will be set with
 468      *           values from rsmd
 469      * @param rsmd the <code>ResultSetMetaData</code> object from which new
 470      *             values for md will be read
 471      * @throws SQLException if an error occurs
 472      */
 473     protected void initMetaData(RowSetMetaData md, ResultSetMetaData rsmd) throws SQLException {
 474         int numCols = rsmd.getColumnCount();
 475 
 476         md.setColumnCount(numCols);
 477         for (int col=1; col <= numCols; col++) {
 478             md.setAutoIncrement(col, rsmd.isAutoIncrement(col));
 479             md.setCaseSensitive(col, rsmd.isCaseSensitive(col));
 480             md.setCurrency(col, rsmd.isCurrency(col));
 481             md.setNullable(col, rsmd.isNullable(col));
 482             md.setSigned(col, rsmd.isSigned(col));
 483             md.setSearchable(col, rsmd.isSearchable(col));
 484             md.setColumnDisplaySize(col, rsmd.getColumnDisplaySize(col));
 485             md.setColumnLabel(col, rsmd.getColumnLabel(col));
 486             md.setColumnName(col, rsmd.getColumnName(col));
 487             md.setSchemaName(col, rsmd.getSchemaName(col));
 488             md.setPrecision(col, rsmd.getPrecision(col));
 489             md.setScale(col, rsmd.getScale(col));
 490             md.setTableName(col, rsmd.getTableName(col));
 491             md.setCatalogName(col, rsmd.getCatalogName(col));
 492             md.setColumnType(col, rsmd.getColumnType(col));
 493             md.setColumnTypeName(col, rsmd.getColumnTypeName(col));
 494         }
 495     }
 496 
 497 
 498     protected void checkState() throws SQLException {
 499 
 500         // If all the three i.e.  conn, ps & rs are
 501         // simultaneously null implies we are not connected
 502         // to the db, implies undesirable state so throw exception
 503 
 504         if (conn == null && ps == null && rs == null ) {
 505             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.invalstate").toString());
 506         }
 507     }
 508 
 509     //---------------------------------------------------------------------
 510     // Reading and writing data
 511     //---------------------------------------------------------------------
 512 
 513     /**
 514      * Creates the internal <code>ResultSet</code> object for which this
 515      * <code>JdbcRowSet</code> object is a wrapper, effectively
 516      * making the result set a JavaBeans component.
 517      * <P>
 518      * Certain properties must have been set before this method is called
 519      * so that it can establish a connection to a database and execute the
 520      * query that will create the result set.  If a <code>DataSource</code>
 521      * object will be used to create the connection, properties for the
 522      * data source name, user name, and password must be set.  If the
 523      * <code>DriverManager</code> will be used, the properties for the
 524      * URL, user name, and password must be set.  In either case, the
 525      * property for the command must be set.  If the command has placeholder
 526      * parameters, those must also be set. This method throws
 527      * an exception if the required properties are not set.
 528      * <P>
 529      * Other properties have default values that may optionally be set
 530      * to new values. The <code>execute</code> method will use the value
 531      * for the command property to create a <code>PreparedStatement</code>
 532      * object and set its properties (escape processing, maximum field
 533      * size, maximum number of rows, and query timeout limit) to be those
 534      * of this rowset.
 535      *
 536      * @throws SQLException if (1) a database access error occurs,
 537      * (2) any required JDBC properties are not set, or (3) if an
 538      * invalid connection exists.
 539      */
 540     public void execute() throws SQLException {
 541         /*
 542          * To execute based on the properties:
 543          * i) determine how to get a connection
 544          * ii) prepare the statement
 545          * iii) set the properties of the statement
 546          * iv) parse the params. and set them
 547          * v) execute the statement
 548          *
 549          * During all of this try to tolerate as many errors
 550          * as possible, many drivers will not support all of
 551          * the properties and will/should throw SQLException
 552          * at us...
 553          *
 554          */
 555 
 556         prepare();
 557 
 558         // set the properties of our shiny new statement
 559         setProperties(ps);
 560 
 561 
 562         // set the parameters
 563         decodeParams(getParams(), ps);
 564 
 565 
 566         // execute the statement
 567         rs = ps.executeQuery();
 568 
 569 
 570         // notify listeners
 571         notifyRowSetChanged();
 572 
 573 
 574     }
 575 
 576     protected void setProperties(PreparedStatement ps) throws SQLException {
 577 
 578         try {
 579             ps.setEscapeProcessing(getEscapeProcessing());
 580         } catch (SQLException ex) {
 581             System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setescapeprocessing").toString() +
 582                                 ex.getLocalizedMessage());
 583         }
 584 
 585         try {
 586             ps.setMaxFieldSize(getMaxFieldSize());
 587         } catch (SQLException ex) {
 588             System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setmaxfieldsize").toString() +
 589                                 ex.getLocalizedMessage());
 590         }
 591 
 592         try {
 593             ps.setMaxRows(getMaxRows());
 594         } catch (SQLException ex) {
 595            System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setmaxrows").toString() +
 596                                 ex.getLocalizedMessage());
 597         }
 598 
 599         try {
 600             ps.setQueryTimeout(getQueryTimeout());
 601         } catch (SQLException ex) {
 602            System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.setquerytimeout").toString() +
 603                                 ex.getLocalizedMessage());
 604         }
 605 
 606     }
 607 
 608     private Connection connect() throws SQLException {
 609 
 610         // Get a JDBC connection.
 611 
 612         // First check for Connection handle object as such if
 613         // "this" initialized  using conn.
 614 
 615         if(conn != null) {
 616             return conn;
 617 
 618         } else if (getDataSourceName() != null) {
 619 
 620             // Connect using JNDI.
 621             try {
 622                 Context ctx = new InitialContext();
 623                 DataSource ds = (DataSource)ctx.lookup
 624                     (getDataSourceName());
 625                 //return ds.getConnection(getUsername(),getPassword());
 626 
 627                 if(getUsername() != null && !getUsername().equals("")) {
 628                      return ds.getConnection(getUsername(),getPassword());
 629                 } else {
 630                      return ds.getConnection();
 631                 }
 632             }
 633             catch (javax.naming.NamingException ex) {
 634                 throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.connect").toString());
 635             }
 636 
 637         } else if (getUrl() != null) {
 638             // Check only for getUrl() != null because
 639             // user, passwd can be null
 640             // Connect using the driver manager.
 641 
 642             return DriverManager.getConnection
 643                     (getUrl(), getUsername(), getPassword());
 644         }
 645         else {
 646             return null;
 647         }
 648 
 649     }
 650 
 651 
 652     protected PreparedStatement prepare() throws SQLException {
 653         // get a connection
 654         conn = connect();
 655 
 656         try {
 657 
 658             Map<String, Class<?>> aMap = getTypeMap();
 659             if( aMap != null) {
 660                 conn.setTypeMap(aMap);
 661             }
 662             ps = conn.prepareStatement(getCommand(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
 663         } catch (SQLException ex) {
 664             System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.prepare").toString() +
 665                                 ex.getLocalizedMessage());
 666 
 667             if (ps != null)
 668                 ps.close();
 669             if (conn != null)
 670                 conn.close();
 671 
 672             throw new SQLException(ex.getMessage());
 673         }
 674 
 675         return ps;
 676     }
 677 
 678     @SuppressWarnings("deprecation")
 679     private void decodeParams(Object[] params, PreparedStatement ps)
 680     throws SQLException {
 681 
 682     // There is a corresponding decodeParams in JdbcRowSetImpl
 683     // which does the same as this method. This is a design flaw.
 684     // Update the CachedRowsetReader.decodeParams when you update
 685     // this method.
 686 
 687     // Adding the same comments to CachedRowsetReader.decodeParams.
 688 
 689         int arraySize;
 690         Object[] param = null;
 691 
 692         for (int i=0; i < params.length; i++) {
 693             if (params[i] instanceof Object[]) {
 694                 param = (Object[])params[i];
 695 
 696                 if (param.length == 2) {
 697                     if (param[0] == null) {
 698                         ps.setNull(i + 1, ((Integer)param[1]).intValue());
 699                         continue;
 700                     }
 701 
 702                     if (param[0] instanceof java.sql.Date ||
 703                         param[0] instanceof java.sql.Time ||
 704                         param[0] instanceof java.sql.Timestamp) {
 705                         System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.detecteddate"));
 706                         if (param[1] instanceof java.util.Calendar) {
 707                             System.err.println(resBundle.handleGetObject("jdbcrowsetimpl.detectedcalendar"));
 708                             ps.setDate(i + 1, (java.sql.Date)param[0],
 709                                        (java.util.Calendar)param[1]);
 710                             continue;
 711                         }
 712                         else {
 713                             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.paramtype").toString());
 714                         }
 715                     }
 716 
 717                     if (param[0] instanceof Reader) {
 718                         ps.setCharacterStream(i + 1, (Reader)param[0],
 719                                               ((Integer)param[1]).intValue());
 720                         continue;
 721                     }
 722 
 723                     /*
 724                      * What's left should be setObject(int, Object, scale)
 725                      */
 726                     if (param[1] instanceof Integer) {
 727                         ps.setObject(i + 1, param[0], ((Integer)param[1]).intValue());
 728                         continue;
 729                     }
 730 
 731                 } else if (param.length == 3) {
 732 
 733                     if (param[0] == null) {
 734                         ps.setNull(i + 1, ((Integer)param[1]).intValue(),
 735                                    (String)param[2]);
 736                         continue;
 737                     }
 738 
 739                     if (param[0] instanceof java.io.InputStream) {
 740                         switch (((Integer)param[2]).intValue()) {
 741                         case JdbcRowSetImpl.UNICODE_STREAM_PARAM:
 742                             ps.setUnicodeStream(i + 1,
 743                                                 (java.io.InputStream)param[0],
 744                                                 ((Integer)param[1]).intValue());
 745                             break;
 746                         case JdbcRowSetImpl.BINARY_STREAM_PARAM:
 747                             ps.setBinaryStream(i + 1,
 748                                                (java.io.InputStream)param[0],
 749                                                ((Integer)param[1]).intValue());
 750                             break;
 751                         case JdbcRowSetImpl.ASCII_STREAM_PARAM:
 752                             ps.setAsciiStream(i + 1,
 753                                               (java.io.InputStream)param[0],
 754                                               ((Integer)param[1]).intValue());
 755                             break;
 756                         default:
 757                             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.paramtype").toString());
 758                         }
 759                     }
 760 
 761                     /*
 762                      * no point at looking at the first element now;
 763                      * what's left must be the setObject() cases.
 764                      */
 765                     if (param[1] instanceof Integer && param[2] instanceof Integer) {
 766                         ps.setObject(i + 1, param[0], ((Integer)param[1]).intValue(),
 767                                      ((Integer)param[2]).intValue());
 768                         continue;
 769                     }
 770 
 771                     throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.paramtype").toString());
 772 
 773                 } else {
 774                     // common case - this catches all SQL92 types
 775                     ps.setObject(i + 1, params[i]);
 776                     continue;
 777                 }
 778             }  else {
 779                // Try to get all the params to be set here
 780                ps.setObject(i + 1, params[i]);
 781 
 782             }
 783         }
 784     }
 785 
 786     /**
 787      * Moves the cursor for this rowset's <code>ResultSet</code>
 788      * object down one row from its current position.
 789      * A <code>ResultSet</code> cursor is initially positioned
 790      * before the first row; the first call to the method
 791      * <code>next</code> makes the first row the current row; the
 792      * second call makes the second row the current row, and so on.
 793      *
 794      * <P>If an input stream is open for the current row, a call
 795      * to the method <code>next</code> will
 796      * implicitly close it. A <code>ResultSet</code> object's
 797      * warning chain is cleared when a new row is read.
 798      *
 799      * @return <code>true</code> if the new current row is valid;
 800      *         <code>false</code> if there are no more rows
 801      * @throws SQLException if a database access error occurs
 802      *            or this rowset does not currently have a valid connection,
 803      *            prepared statement, and result set
 804      */
 805     public boolean next() throws SQLException {
 806         checkState();
 807 
 808         boolean b = rs.next();
 809         notifyCursorMoved();
 810         return b;
 811     }
 812 
 813     /**
 814      * Releases this rowset's <code>ResultSet</code> object's database and
 815      * JDBC resources immediately instead of waiting for
 816      * this to happen when it is automatically closed.
 817      *
 818      * <P><B>Note:</B> A <code>ResultSet</code> object
 819      * is automatically closed by the
 820      * <code>Statement</code> object that generated it when
 821      * that <code>Statement</code> object is closed,
 822      * re-executed, or is used to retrieve the next result from a
 823      * sequence of multiple results. A <code>ResultSet</code> object
 824      * is also automatically closed when it is garbage collected.
 825      *
 826      * @throws SQLException if a database access error occurs
 827      */
 828     public void close() throws SQLException {
 829         if (rs != null)
 830             rs.close();
 831         if (ps != null)
 832             ps.close();
 833         if (conn != null)
 834             conn.close();
 835     }
 836 
 837     /**
 838      * Reports whether the last column read from this rowset's
 839      * <code>ResultSet</code> object had a value of SQL <code>NULL</code>.
 840      * Note that you must first call one of the <code>getXXX</code> methods
 841      * on a column to try to read its value and then call
 842      * the method <code>wasNull</code> to see if the value read was
 843      * SQL <code>NULL</code>.
 844      *
 845      * @return <code>true</code> if the last column value read was SQL
 846      *         <code>NULL</code> and <code>false</code> otherwise
 847      * @throws SQLException if a database access error occurs
 848      *            or this rowset does not have a currently valid connection,
 849      *            prepared statement, and result set
 850      */
 851     public boolean wasNull() throws SQLException {
 852         checkState();
 853 
 854         return rs.wasNull();
 855     }
 856 
 857     //======================================================================
 858     // Methods for accessing results by column index
 859     //======================================================================
 860 
 861     /**
 862      * Gets the value of the designated column in the current row
 863      * of this rowset's <code>ResultSet</code> object as
 864      * a <code>String</code>.
 865      *
 866      * @param columnIndex the first column is 1, the second is 2, and so on
 867      * @return the column value; if the value is SQL <code>NULL</code>, the
 868      * value returned is <code>null</code>
 869      * @throws SQLException if (1) a database access error occurs
 870      *            or (2) this rowset does not currently have a valid connection,
 871      *            prepared statement, and result set
 872      */
 873     public String getString(int columnIndex) throws SQLException {
 874         checkState();
 875 
 876         return rs.getString(columnIndex);
 877     }
 878 
 879     /**
 880      * Gets the value of the designated column in the current row
 881      * of this rowset's <code>ResultSet</code> object as
 882      * a <code>boolean</code>.
 883      *
 884      * @param columnIndex the first column is 1, the second is 2, and so on
 885      * @return the column value; if the value is SQL <code>NULL</code>, the
 886      * value returned is <code>false</code>
 887      * @throws SQLException if (1) a database access error occurs
 888      *            or (2) this rowset does not have a currently valid connection,
 889      *            prepared statement, and result set
 890      */
 891     public boolean getBoolean(int columnIndex) throws SQLException {
 892         checkState();
 893 
 894         return rs.getBoolean(columnIndex);
 895     }
 896 
 897     /**
 898      * Gets the value of the designated column in the current row
 899      * of this rowset's <code>ResultSet</code> object as
 900      * a <code>byte</code>.
 901      *
 902      * @param columnIndex the first column is 1, the second is 2, and so on
 903      * @return the column value; if the value is SQL <code>NULL</code>, the
 904      * value returned is <code>0</code>
 905      * @throws SQLException if (1) a database access error occurs
 906      *            or (2) this rowset does not have a currently valid connection,
 907      *            prepared statement, and result set
 908      */
 909     public byte getByte(int columnIndex) throws SQLException {
 910         checkState();
 911 
 912         return rs.getByte(columnIndex);
 913     }
 914 
 915     /**
 916      * Gets the value of the designated column in the current row
 917      * of this rowset's <code>ResultSet</code> object as
 918      * a <code>short</code>.
 919      *
 920      * @param columnIndex the first column is 1, the second is 2, and so on
 921      * @return the column value; if the value is SQL <code>NULL</code>, the
 922      * value returned is <code>0</code>
 923      * @throws SQLException if (1) a database access error occurs
 924      *            or (2) this rowset does not have a currently valid connection,
 925      *            prepared statement, and result set
 926      */
 927     public short getShort(int columnIndex) throws SQLException {
 928         checkState();
 929 
 930         return rs.getShort(columnIndex);
 931     }
 932 
 933     /**
 934      * Gets the value of the designated column in the current row
 935      * of this rowset's <code>ResultSet</code> object as
 936      * an <code>int</code>.
 937      *
 938      * @param columnIndex the first column is 1, the second is 2, and so on
 939      * @return the column value; if the value is SQL <code>NULL</code>, the
 940      * value returned is <code>0</code>
 941      * @throws SQLException if (1) a database access error occurs
 942      *            or (2) this rowset does not have a currently valid connection,
 943      *            prepared statement, and result set
 944      */
 945     public int getInt(int columnIndex) throws SQLException {
 946         checkState();
 947 
 948         return rs.getInt(columnIndex);
 949     }
 950 
 951     /**
 952      * Gets the value of the designated column in the current row
 953      * of this rowset's <code>ResultSet</code> object as
 954      * a <code>long</code>.
 955      *
 956      * @param columnIndex the first column is 1, the second is 2, and so on
 957      * @return the column value; if the value is SQL <code>NULL</code>, the
 958      * value returned is <code>0</code>
 959      * @throws SQLException if (1) a database access error occurs
 960      *            or (2) this rowset does not have a currently valid connection,
 961      *            prepared statement, and result set
 962      */
 963     public long getLong(int columnIndex) throws SQLException {
 964         checkState();
 965 
 966         return rs.getLong(columnIndex);
 967     }
 968 
 969     /**
 970      * Gets the value of the designated column in the current row
 971      * of this rowset's <code>ResultSet</code> object as
 972      * a <code>float</code>.
 973      *
 974      * @param columnIndex the first column is 1, the second is 2, and so on
 975      * @return the column value; if the value is SQL <code>NULL</code>, the
 976      * value returned is <code>0</code>
 977      * @throws SQLException if (1) a database access error occurs
 978      *            or (2) this rowset does not have a currently valid connection,
 979      *            prepared statement, and result set
 980      */
 981     public float getFloat(int columnIndex) throws SQLException {
 982         checkState();
 983 
 984         return rs.getFloat(columnIndex);
 985     }
 986 
 987     /**
 988      * Gets the value of the designated column in the current row
 989      * of this rowset's <code>ResultSet</code> object as
 990      * a <code>double</code>.
 991      *
 992      * @param columnIndex the first column is 1, the second is 2, and so on
 993      * @return the column value; if the value is SQL <code>NULL</code>, the
 994      * value returned is <code>0</code>
 995      * @throws SQLException if (1) a database access error occurs
 996      *            or (2) this rowset does not have a currently valid connection,
 997      *            prepared statement, and result set
 998      */
 999     public double getDouble(int columnIndex) throws SQLException {
1000         checkState();
1001 
1002         return rs.getDouble(columnIndex);
1003     }
1004 
1005     /**
1006      * Gets the value of the designated column in the current row
1007      * of this rowset's <code>ResultSet</code> object as
1008      * a <code>java.sql.BigDecimal</code>.
1009      *
1010      * @param columnIndex the first column is 1, the second is 2, and so on
1011      * @param scale the number of digits to the right of the decimal point
1012      * @return the column value; if the value is SQL <code>NULL</code>, the
1013      * value returned is <code>null</code>
1014      * @throws SQLException if (1) database access error occurs
1015      *            or (2) this rowset does not have a currently valid connection,
1016      *            prepared statement, and result set
1017      * @deprecated
1018      */
1019     @Deprecated
1020     public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
1021         checkState();
1022 
1023         return rs.getBigDecimal(columnIndex, scale);
1024     }
1025 
1026     /**
1027      * Gets the value of the designated column in the current row
1028      * of this rowset's <code>ResultSet</code> object as
1029      * a <code>byte</code> array in the Java programming language.
1030      * The bytes represent the raw values returned by the driver.
1031      *
1032      * @param columnIndex the first column is 1, the second is 2, and so on
1033      * @return the column value; if the value is SQL <code>NULL</code>, the
1034      * value returned is <code>null</code>
1035      * @throws SQLException if (1) a database access error occurs
1036      *            or (2) this rowset does not have a currently valid connection,
1037      *            prepared statement, and result set
1038      */
1039     public byte[] getBytes(int columnIndex) throws SQLException {
1040         checkState();
1041 
1042         return rs.getBytes(columnIndex);
1043     }
1044 
1045     /**
1046      * Gets the value of the designated column in the current row
1047      * of this rowset's <code>ResultSet</code> object as
1048      * a <code>java.sql.Date</code> object in the Java programming language.
1049      *
1050      * @param columnIndex the first column is 1, the second is 2, and so on
1051      * @return the column value; if the value is SQL <code>NULL</code>, the
1052      * value returned is <code>null</code>
1053      * @throws SQLException if (1) a database access error occurs
1054      *            or (2) this rowset does not have a currently valid connection,
1055      *            prepared statement, and result set
1056      */
1057     public java.sql.Date getDate(int columnIndex) throws SQLException {
1058         checkState();
1059 
1060         return rs.getDate(columnIndex);
1061     }
1062 
1063     /**
1064      * Gets the value of the designated column in the current row
1065      * of this rowset's <code>ResultSet</code> object as
1066      * a <code>java.sql.Time</code> object in the Java programming language.
1067      *
1068      * @param columnIndex the first column is 1, the second is 2, and so on
1069      * @return the column value; if the value is SQL <code>NULL</code>, the
1070      * value returned is <code>null</code>
1071      * @throws SQLException if (1) a database access error occurs
1072      *            or (2) this rowset does not have a currently valid connection,
1073      *            prepared statement, and result set
1074      */
1075     public java.sql.Time getTime(int columnIndex) throws SQLException {
1076         checkState();
1077 
1078         return rs.getTime(columnIndex);
1079     }
1080 
1081     /**
1082      * Gets the value of the designated column in the current row
1083      * of this rowset's <code>ResultSet</code> object as
1084      * a <code>java.sql.Timestamp</code> object in the Java programming language.
1085      *
1086      * @param columnIndex the first column is 1, the second is 2, and so on
1087      * @return the column value; if the value is SQL <code>NULL</code>, the
1088      * value returned is <code>null</code>
1089      * @throws SQLException if (1) a database access error occurs
1090      *            or (2) this rowset does not have a currently valid connection,
1091      *            prepared statement, and result set
1092      */
1093     public java.sql.Timestamp getTimestamp(int columnIndex) throws SQLException {
1094         checkState();
1095 
1096         return rs.getTimestamp(columnIndex);
1097     }
1098 
1099     /**
1100      * Gets the value of the designated column in the current row
1101      * of this rowset's <code>ResultSet</code> object as
1102      * a stream of ASCII characters. The value can then be read in chunks from the
1103      * stream. This method is particularly
1104      * suitable for retrieving large <code>LONGVARCHAR</code> values.
1105      * The JDBC driver will
1106      * do any necessary conversion from the database format into ASCII.
1107      *
1108      * <P><B>Note:</B> All the data in the returned stream must be
1109      * read prior to getting the value of any other column. The next
1110      * call to a <code>getXXX</code> method implicitly closes the stream.  Also, a
1111      * stream may return <code>0</code> when the method
1112      * <code>InputStream.available</code>
1113      * is called whether there is data available or not.
1114      *
1115      * @param columnIndex the first column is 1, the second is 2, and so on
1116      * @return a Java input stream that delivers the database column value
1117      * as a stream of one-byte ASCII characters;
1118      * if the value is SQL <code>NULL</code>, the
1119      * value returned is <code>null</code>
1120      * @throws SQLException if (1) database access error occurs
1121      *            (2) this rowset does not have a currently valid connection,
1122      *            prepared statement, and result set
1123      */
1124     public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException {
1125         checkState();
1126 
1127         return rs.getAsciiStream(columnIndex);
1128     }
1129 
1130     /**
1131      * Gets the value of the designated column in the current row
1132      * of this rowset's <code>ResultSet</code> object as
1133      * as a stream of Unicode characters.
1134      * The value can then be read in chunks from the
1135      * stream. This method is particularly
1136      * suitable for retrieving large<code>LONGVARCHAR</code>values.  The JDBC driver will
1137      * do any necessary conversion from the database format into Unicode.
1138      * The byte format of the Unicode stream must be Java UTF-8,
1139      * as specified in the Java virtual machine specification.
1140      *
1141      * <P><B>Note:</B> All the data in the returned stream must be
1142      * read prior to getting the value of any other column. The next
1143      * call to a <code>getXXX</code> method implicitly closes the stream.  Also, a
1144      * stream may return <code>0</code> when the method
1145      * <code>InputStream.available</code>
1146      * is called whether there is data available or not.
1147      *
1148      * @param columnIndex the first column is 1, the second is 2, and so on
1149      * @return a Java input stream that delivers the database column value
1150      * as a stream in Java UTF-8 byte format;
1151      * if the value is SQL <code>NULL</code>, the value returned is <code>null</code>
1152      * @throws SQLException if (1) a database access error occurs
1153      *            or (2) this rowset does not have a currently valid connection,
1154      *            prepared statement, and result set
1155      * @deprecated use <code>getCharacterStream</code> in place of
1156      *              <code>getUnicodeStream</code>
1157      */
1158     @Deprecated
1159     public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException {
1160         checkState();
1161 
1162         return rs.getUnicodeStream(columnIndex);
1163     }
1164 
1165     /**
1166      * Gets the value of a column in the current row as a stream of
1167      * the value of the designated column in the current row
1168      * of this rowset's <code>ResultSet</code> object as a binary stream of
1169      * uninterpreted bytes. The value can then be read in chunks from the
1170      * stream. This method is particularly
1171      * suitable for retrieving large <code>LONGVARBINARY</code> values.
1172      *
1173      * <P><B>Note:</B> All the data in the returned stream must be
1174      * read prior to getting the value of any other column. The next
1175      * call to a <code>getXXX</code> method implicitly closes the stream.  Also, a
1176      * stream may return <code>0</code> when the method
1177      * <code>InputStream.available</code>
1178      * is called whether there is data available or not.
1179      *
1180      * @param columnIndex the first column is 1, the second is 2, and so on
1181      * @return a Java input stream that delivers the database column value
1182      * as a stream of uninterpreted bytes;
1183      * if the value is SQL <code>NULL</code>, the value returned is <code>null</code>
1184      * @throws SQLException if (1) a database access error occurs
1185      *            or (2) this rowset does not have a currently valid connection,
1186      *            prepared statement, and result set
1187      */
1188     public java.io.InputStream getBinaryStream(int columnIndex) throws SQLException {
1189         checkState();
1190 
1191         return rs.getBinaryStream(columnIndex);
1192     }
1193 
1194 
1195     //======================================================================
1196     // Methods for accessing results by column name
1197     //======================================================================
1198 
1199     /**
1200      * Gets the value of the designated column in the current row
1201      * of this rowset's <code>ResultSet</code> object as
1202      * a <code>String</code>.
1203      *
1204      * @param columnName the SQL name of the column
1205      * @return the column value; if the value is SQL <code>NULL</code>, the
1206      * value returned is <code>null</code>
1207      * @throws SQLException if (1) a database access error occurs
1208      *            or (2) this rowset does not have a currently valid connection,
1209      *            prepared statement, and result set
1210      */
1211     public String getString(String columnName) throws SQLException {
1212         return getString(findColumn(columnName));
1213     }
1214 
1215     /**
1216      * Gets the value of the designated column in the current row
1217      * of this rowset's <code>ResultSet</code> object as
1218      * a <code>boolean</code>.
1219      *
1220      * @param columnName the SQL name of the column
1221      * @return the column value; if the value is SQL <code>NULL</code>, the
1222      * value returned is <code>false</code>
1223      * @throws SQLException if (1) a database access error occurs
1224      *            or (2) this rowset does not have a currently valid connection,
1225      *            prepared statement, and result set
1226      */
1227     public boolean getBoolean(String columnName) throws SQLException {
1228         return getBoolean(findColumn(columnName));
1229     }
1230 
1231     /**
1232      * Gets the value of the designated column in the current row
1233      * of this rowset's <code>ResultSet</code> object as
1234      * a <code>byte</code>.
1235      *
1236      * @param columnName the SQL name of the column
1237      * @return the column value; if the value is SQL <code>NULL</code>, the
1238      * value returned is <code>0</code>
1239      * @throws SQLException if (1) a database access error occurs
1240      *            or (2) this rowset does not have a currently valid connection,
1241      *            prepared statement, and result set
1242      */
1243     public byte getByte(String columnName) throws SQLException {
1244         return getByte(findColumn(columnName));
1245     }
1246 
1247     /**
1248      * Gets the value of the designated column in the current row
1249      * of this rowset's <code>ResultSet</code> object as
1250      * a <code>short</code>.
1251      *
1252      * @param columnName the SQL name of the column
1253      * @return the column value; if the value is SQL <code>NULL</code>, the
1254      * value returned is <code>0</code>
1255      * @throws SQLException if (1) a database access error occurs
1256      *            or (2) this rowset does not have a currently valid connection,
1257      *            prepared statement, and result set
1258      */
1259     public short getShort(String columnName) throws SQLException {
1260         return getShort(findColumn(columnName));
1261     }
1262 
1263     /**
1264      * Gets the value of the designated column in the current row
1265      * of this rowset's <code>ResultSet</code> object as
1266      * an <code>int</code>.
1267      *
1268      * @param columnName the SQL name of the column
1269      * @return the column value; if the value is SQL <code>NULL</code>, the
1270      * value returned is <code>0</code>
1271      * @throws SQLException if (1) a database access error occurs
1272      *            or (2) this rowset does not have a currently valid connection,
1273      *            prepared statement, and result set
1274      */
1275     public int getInt(String columnName) throws SQLException {
1276         return getInt(findColumn(columnName));
1277     }
1278 
1279     /**
1280      * Gets the value of the designated column in the current row
1281      * of this rowset's <code>ResultSet</code> object as
1282      * a <code>long</code>.
1283      *
1284      * @param columnName the SQL name of the column
1285      * @return the column value; if the value is SQL <code>NULL</code>, the
1286      * value returned is <code>0</code>
1287      * @throws SQLException if a database access error occurs
1288      *            or this rowset does not have a currently valid connection,
1289      *            prepared statement, and result set
1290      */
1291     public long getLong(String columnName) throws SQLException {
1292         return getLong(findColumn(columnName));
1293     }
1294 
1295     /**
1296      * Gets the value of the designated column in the current row
1297      * of this rowset's <code>ResultSet</code> object as
1298      * a <code>float</code>.
1299      *
1300      * @param columnName the SQL name of the column
1301      * @return the column value; if the value is SQL <code>NULL</code>, the
1302      * value returned is <code>0</code>
1303      * @throws SQLException if (1) a database access error occurs
1304      *            or (2) this rowset does not have a currently valid connection,
1305      *            prepared statement, and result set
1306      */
1307     public float getFloat(String columnName) throws SQLException {
1308         return getFloat(findColumn(columnName));
1309     }
1310 
1311     /**
1312      * Gets the value of the designated column in the current row
1313      * of this rowset's <code>ResultSet</code> object as
1314      * a <code>double</code>.
1315      *
1316      * @param columnName the SQL name of the column
1317      * @return the column value; if the value is SQL <code>NULL</code>, the
1318      * value returned is <code>0</code>
1319      * @throws SQLException if (1) a database access error occurs
1320      *            or (2) this rowset does not have a currently valid connection,
1321      *            prepared statement, and result set
1322      */
1323     public double getDouble(String columnName) throws SQLException {
1324         return getDouble(findColumn(columnName));
1325     }
1326 
1327     /**
1328      * Gets the value of the designated column in the current row
1329      * of this rowset's <code>ResultSet</code> object as
1330      * a <code>java.math.BigDecimal</code>.
1331      *
1332      * @param columnName the SQL name of the column
1333      * @param scale the number of digits to the right of the decimal point
1334      * @return the column value; if the value is SQL <code>NULL</code>, the
1335      * value returned is <code>null</code>
1336      * @throws SQLException if (1) adatabase access error occurs
1337      *            or (2) this rowset does not have a currently valid connection,
1338      *            prepared statement, and result set
1339      * @deprecated
1340      */
1341     @Deprecated
1342     public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException {
1343         return getBigDecimal(findColumn(columnName), scale);
1344     }
1345 
1346     /**
1347      * Gets the value of the designated column in the current row
1348      * of this rowset's <code>ResultSet</code> object as
1349      * a <code>byte</code> array in the Java programming language.
1350      * The bytes represent the raw values returned by the driver.
1351      *
1352      * @param columnName the SQL name of the column
1353      * @return the column value; if the value is SQL <code>NULL</code>, the
1354      * value returned is <code>null</code>
1355      * @throws SQLException if (1) a database access error occurs
1356      *            or (2) this rowset does not have a currently valid connection,
1357      *            prepared statement, and result set
1358      */
1359     public byte[] getBytes(String columnName) throws SQLException {
1360         return getBytes(findColumn(columnName));
1361     }
1362 
1363     /**
1364      * Gets the value of the designated column in the current row
1365      * of this rowset's <code>ResultSet</code> object as
1366      * a <code>java.sql.Date</code> object in the Java programming language.
1367      *
1368      * @param columnName the SQL name of the column
1369      * @return the column value; if the value is SQL <code>NULL</code>, the
1370      * value returned is <code>null</code>
1371      * @throws SQLException if (1) a database access error occurs
1372      *            or (2) this rowset does not have a currently valid connection,
1373      *            prepared statement, and result set
1374      */
1375     public java.sql.Date getDate(String columnName) throws SQLException {
1376         return getDate(findColumn(columnName));
1377     }
1378 
1379     /**
1380      * Gets the value of the designated column in the current row
1381      * of this rowset's <code>ResultSet</code> object as
1382      * a <code>java.sql.Time</code> object in the Java programming language.
1383      *
1384      * @param columnName the SQL name of the column
1385      * @return the column value;
1386      * if the value is SQL <code>NULL</code>,
1387      * the value returned is <code>null</code>
1388      * @throws SQLException if (1) a database access error occurs
1389      *            or (2) this rowset does not have a currently valid connection,
1390      *            prepared statement, and result set
1391      */
1392     public java.sql.Time getTime(String columnName) throws SQLException {
1393         return getTime(findColumn(columnName));
1394     }
1395 
1396     /**
1397      * Gets the value of the designated column in the current row
1398      * of this rowset's <code>ResultSet</code> object as
1399      * a <code>java.sql.Timestamp</code> object.
1400      *
1401      * @param columnName the SQL name of the column
1402      * @return the column value; if the value is SQL <code>NULL</code>, the
1403      * value returned is <code>null</code>
1404      * @throws SQLException if (1) a database access error occurs
1405      *            or (2) this rowset does not have a currently valid connection,
1406      *            prepared statement, and result set
1407      */
1408     public java.sql.Timestamp getTimestamp(String columnName) throws SQLException {
1409         return getTimestamp(findColumn(columnName));
1410     }
1411 
1412     /**
1413      * Gets the value of the designated column in the current row
1414      * of this rowset's <code>ResultSet</code> object as a stream of
1415      * ASCII characters. The value can then be read in chunks from the
1416      * stream. This method is particularly
1417      * suitable for retrieving large <code>LONGVARCHAR</code> values.
1418      * The JDBC driver will
1419      * do any necessary conversion from the database format into ASCII.
1420      *
1421      * <P><B>Note:</B> All the data in the returned stream must be
1422      * read prior to getting the value of any other column. The next
1423      * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
1424      * stream may return <code>0</code> when the method <code>available</code>
1425      * is called whether there is data available or not.
1426      *
1427      * @param columnName the SQL name of the column
1428      * @return a Java input stream that delivers the database column value
1429      * as a stream of one-byte ASCII characters.
1430      * If the value is SQL <code>NULL</code>,
1431      * the value returned is <code>null</code>.
1432      * @throws SQLException if (1) a database access error occurs
1433      *            or (2) this rowset does not have a currently valid connection,
1434      *            prepared statement, and result set
1435      */
1436     public java.io.InputStream getAsciiStream(String columnName) throws SQLException {
1437         return getAsciiStream(findColumn(columnName));
1438     }
1439 
1440     /**
1441      * Gets the value of the designated column in the current row
1442      * of this rowset's <code>ResultSet</code> object as a stream of
1443      * Unicode characters. The value can then be read in chunks from the
1444      * stream. This method is particularly
1445      * suitable for retrieving large <code>LONGVARCHAR</code> values.
1446      * The JDBC driver will
1447      * do any necessary conversion from the database format into Unicode.
1448      * The byte format of the Unicode stream must be Java UTF-8,
1449      * as defined in the Java virtual machine specification.
1450      *
1451      * <P><B>Note:</B> All the data in the returned stream must be
1452      * read prior to getting the value of any other column. The next
1453      * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
1454      * stream may return <code>0</code> when the method <code>available</code>
1455      * is called whether there is data available or not.
1456      *
1457      * @param columnName the SQL name of the column
1458      * @return a Java input stream that delivers the database column value
1459      * as a stream of two-byte Unicode characters.
1460      * If the value is SQL <code>NULL</code>,
1461      * the value returned is <code>null</code>.
1462      * @throws SQLException if (1) a database access error occurs
1463      *            or (2) this rowset does not have a currently valid connection,
1464      *            prepared statement, and result set
1465      * @deprecated
1466      */
1467     @Deprecated
1468     public java.io.InputStream getUnicodeStream(String columnName) throws SQLException {
1469         return getUnicodeStream(findColumn(columnName));
1470     }
1471 
1472     /**
1473      * Gets the value of the designated column in the current row
1474      * of this rowset's <code>ResultSet</code> object as a stream of uninterpreted
1475      * <code>byte</code>s.
1476      * The value can then be read in chunks from the
1477      * stream. This method is particularly
1478      * suitable for retrieving large <code>LONGVARBINARY</code>
1479      * values.
1480      *
1481      * <P><B>Note:</B> All the data in the returned stream must be
1482      * read prior to getting the value of any other column. The next
1483      * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
1484      * stream may return <code>0</code> when the method <code>available</code>
1485      * is called whether there is data available or not.
1486      *
1487      * @param columnName the SQL name of the column
1488      * @return a Java input stream that delivers the database column value
1489      * as a stream of uninterpreted bytes;
1490      * if the value is SQL <code>NULL</code>, the result is <code>null</code>
1491      * @throws SQLException if (1) a database access error occurs
1492      *            or (2) this rowset does not have a currently valid connection,
1493      *            prepared statement, and result set
1494      */
1495     public java.io.InputStream getBinaryStream(String columnName) throws SQLException {
1496         return getBinaryStream(findColumn(columnName));
1497     }
1498 
1499 
1500     //=====================================================================
1501     // Advanced features:
1502     //=====================================================================
1503 
1504     /**
1505      * Returns the first warning reported by calls on this rowset's
1506      * <code>ResultSet</code> object.
1507      * Subsequent warnings on this rowset's <code>ResultSet</code> object
1508      * will be chained to the <code>SQLWarning</code> object that
1509      * this method returns.
1510      *
1511      * <P>The warning chain is automatically cleared each time a new
1512      * row is read.
1513      *
1514      * <P><B>Note:</B> This warning chain only covers warnings caused
1515      * by <code>ResultSet</code> methods.  Any warning caused by
1516      * <code>Statement</code> methods
1517      * (such as reading OUT parameters) will be chained on the
1518      * <code>Statement</code> object.
1519      *
1520      * @return the first <code>SQLWarning</code> object reported or <code>null</code>
1521      * @throws SQLException if (1) a database access error occurs
1522      *            or (2) this rowset does not have a currently valid connection,
1523      *            prepared statement, and result set
1524      */
1525     public SQLWarning getWarnings() throws SQLException {
1526         checkState();
1527 
1528         return rs.getWarnings();
1529     }
1530 
1531     /**
1532      * Clears all warnings reported on this rowset's <code>ResultSet</code> object.
1533      * After this method is called, the method <code>getWarnings</code>
1534      * returns <code>null</code> until a new warning is
1535      * reported for this rowset's <code>ResultSet</code> object.
1536      *
1537      * @throws SQLException if (1) a database access error occurs
1538      *            or (2) this rowset does not have a currently valid connection,
1539      *            prepared statement, and result set
1540      */
1541     public void clearWarnings() throws SQLException {
1542         checkState();
1543 
1544         rs.clearWarnings();
1545     }
1546 
1547     /**
1548      * Gets the name of the SQL cursor used by this rowset's <code>ResultSet</code>
1549      * object.
1550      *
1551      * <P>In SQL, a result table is retrieved through a cursor that is
1552      * named. The current row of a result set can be updated or deleted
1553      * using a positioned update/delete statement that references the
1554      * cursor name. To insure that the cursor has the proper isolation
1555      * level to support update, the cursor's <code>select</code> statement should be
1556      * of the form 'select for update'. If the 'for update' clause is
1557      * omitted, the positioned updates may fail.
1558      *
1559      * <P>The JDBC API supports this SQL feature by providing the name of the
1560      * SQL cursor used by a <code>ResultSet</code> object.
1561      * The current row of a <code>ResultSet</code> object
1562      * is also the current row of this SQL cursor.
1563      *
1564      * <P><B>Note:</B> If positioned update is not supported, a
1565      * <code>SQLException</code> is thrown.
1566      *
1567      * @return the SQL name for this rowset's <code>ResultSet</code> object's cursor
1568      * @throws SQLException if (1) a database access error occurs
1569      *            or (2) xthis rowset does not have a currently valid connection,
1570      *            prepared statement, and result set
1571      */
1572     public String getCursorName() throws SQLException {
1573         checkState();
1574 
1575         return rs.getCursorName();
1576     }
1577 
1578     /**
1579      * Retrieves the  number, types and properties of
1580      * this rowset's <code>ResultSet</code> object's columns.
1581      *
1582      * @return the description of this rowset's <code>ResultSet</code>
1583      *     object's columns
1584      * @throws SQLException if (1) a database access error occurs
1585      *     or (2) this rowset does not have a currently valid connection,
1586      *     prepared statement, and result set
1587      */
1588     public ResultSetMetaData getMetaData() throws SQLException {
1589 
1590         checkState();
1591 
1592         // It may be the case that JdbcRowSet might not have been
1593         // initialized with ResultSet handle and may be by PreparedStatement
1594         // internally when we set JdbcRowSet.setCommand().
1595         // We may require all the basic properties of setEscapeProcessing
1596         // setMaxFieldSize etc. which an application can use before we call
1597         // execute.
1598         try {
1599              checkState();
1600         } catch(SQLException sqle) {
1601              prepare();
1602              // will return ResultSetMetaData
1603              return ps.getMetaData();
1604         }
1605         return rs.getMetaData();
1606     }
1607 
1608     /**
1609      * <p>Gets the value of the designated column in the current row
1610      * of this rowset's <code>ResultSet</code> object as
1611      * an <code>Object</code>.
1612      *
1613      * <p>This method will return the value of the given column as a
1614      * Java object.  The type of the Java object will be the default
1615      * Java object type corresponding to the column's SQL type,
1616      * following the mapping for built-in types specified in the JDBC
1617      * specification.
1618      *
1619      * <p>This method may also be used to read datatabase-specific
1620      * abstract data types.
1621      *
1622      * In the JDBC 3.0 API, the behavior of method
1623      * <code>getObject</code> is extended to materialize
1624      * data of SQL user-defined types.  When a column contains
1625      * a structured or distinct value, the behavior of this method is as
1626      * if it were a call to: <code>getObject(columnIndex,
1627      * this.getStatement().getConnection().getTypeMap())</code>.
1628      *
1629      * @param columnIndex the first column is 1, the second is 2, and so on
1630      * @return a <code>java.lang.Object</code> holding the column value
1631      * @throws SQLException if (1) a database access error occurs
1632      *            or (2) this rowset does not currently have a valid connection,
1633      *            prepared statement, and result set
1634      */
1635     public Object getObject(int columnIndex) throws SQLException {
1636         checkState();
1637 
1638         return rs.getObject(columnIndex);
1639     }
1640 
1641     /**
1642      * <p>Gets the value of the designated column in the current row
1643      * of this rowset's <code>ResultSet</code> object as
1644      * an <code>Object</code>.
1645      *
1646      * <p>This method will return the value of the given column as a
1647      * Java object.  The type of the Java object will be the default
1648      * Java object type corresponding to the column's SQL type,
1649      * following the mapping for built-in types specified in the JDBC
1650      * specification.
1651      *
1652      * <p>This method may also be used to read datatabase-specific
1653      * abstract data types.
1654      *
1655      * In the JDBC 3.0 API, the behavior of the method
1656      * <code>getObject</code> is extended to materialize
1657      * data of SQL user-defined types.  When a column contains
1658      * a structured or distinct value, the behavior of this method is as
1659      * if it were a call to: <code>getObject(columnIndex,
1660      * this.getStatement().getConnection().getTypeMap())</code>.
1661      *
1662      * @param columnName the SQL name of the column
1663      * @return a <code>java.lang.Object</code> holding the column value
1664      * @throws SQLException if (1) a database access error occurs
1665      *            or (2) this rowset does not currently have a valid connection,
1666      *            prepared statement, and result set
1667      */
1668     public Object getObject(String columnName) throws SQLException {
1669         return getObject(findColumn(columnName));
1670     }
1671 
1672     //----------------------------------------------------------------
1673 
1674     /**
1675      * Maps the given <code>JdbcRowSetImpl</code> column name to its
1676      * <code>JdbcRowSetImpl</code> column index and reflects this on
1677      * the internal <code>ResultSet</code> object.
1678      *
1679      * @param columnName the name of the column
1680      * @return the column index of the given column name
1681      * @throws SQLException if (1) a database access error occurs
1682      * (2) this rowset does not have a currently valid connection,
1683      * prepared statement, and result set
1684      */
1685     public int findColumn(String columnName) throws SQLException {
1686         checkState();
1687 
1688         return rs.findColumn(columnName);
1689     }
1690 
1691 
1692     //--------------------------JDBC 2.0-----------------------------------
1693 
1694     //---------------------------------------------------------------------
1695     // Getters and Setters
1696     //---------------------------------------------------------------------
1697 
1698     /**
1699      * Gets the value of the designated column in the current row
1700      * of this rowset's <code>ResultSet</code> object as a
1701      * <code>java.io.Reader</code> object.
1702      * @return a <code>java.io.Reader</code> object that contains the column
1703      * value; if the value is SQL <code>NULL</code>, the value returned is
1704      * <code>null</code>.
1705      * @param columnIndex the first column is 1, the second is 2, and so on
1706      *
1707      */
1708     public java.io.Reader getCharacterStream(int columnIndex) throws SQLException {
1709         checkState();
1710 
1711         return rs.getCharacterStream(columnIndex);
1712     }
1713 
1714     /**
1715      * Gets the value of the designated column in the current row
1716      * of this rowset's <code>ResultSet</code> object as a
1717      * <code>java.io.Reader</code> object.
1718      *
1719      * @return a <code>java.io.Reader</code> object that contains the column
1720      * value; if the value is SQL <code>NULL</code>, the value returned is
1721      * <code>null</code>.
1722      * @param columnName the name of the column
1723      * @return the value in the specified column as a <code>java.io.Reader</code>
1724      *
1725      */
1726     public java.io.Reader getCharacterStream(String columnName) throws SQLException {
1727         return getCharacterStream(findColumn(columnName));
1728     }
1729 
1730     /**
1731      * Gets the value of the designated column in the current row
1732      * of this rowset's <code>ResultSet</code> object as a
1733      * <code>java.math.BigDecimal</code> with full precision.
1734      *
1735      * @param columnIndex the first column is 1, the second is 2, and so on
1736      * @return the column value (full precision);
1737      * if the value is SQL <code>NULL</code>, the value returned is
1738      * <code>null</code>.
1739      * @throws SQLException if a database access error occurs
1740      *            or this rowset does not currently have a valid
1741      *            connection, prepared statement, and result set
1742      */
1743     public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
1744         checkState();
1745 
1746         return rs.getBigDecimal(columnIndex);
1747     }
1748 
1749     /**
1750      * Gets the value of the designated column in the current row
1751      * of this rowset's <code>ResultSet</code> object as a
1752      * <code>java.math.BigDecimal</code> with full precision.
1753      *
1754      * @param columnName the column name
1755      * @return the column value (full precision);
1756      * if the value is SQL <code>NULL</code>, the value returned is
1757      * <code>null</code>.
1758      * @throws SQLException if a database access error occurs
1759      *            or this rowset does not currently have a valid
1760      *            connection, prepared statement, and result set
1761      */
1762     public BigDecimal getBigDecimal(String columnName) throws SQLException {
1763         return getBigDecimal(findColumn(columnName));
1764     }
1765 
1766     //---------------------------------------------------------------------
1767     // Traversal/Positioning
1768     //---------------------------------------------------------------------
1769 
1770     /**
1771      * Indicates whether the cursor is before the first row in
1772      * this rowset's <code>ResultSet</code> object.
1773      *
1774      * @return <code>true</code> if the cursor is before the first row;
1775      * <code>false</code> if the cursor is at any other position or the
1776      * result set contains no rows
1777      * @throws SQLException if a database access error occurs
1778      *            or this rowset does not currently have a valid
1779      *            connection, prepared statement, and result set
1780      */
1781     public boolean isBeforeFirst() throws SQLException {
1782         checkState();
1783 
1784         return rs.isBeforeFirst();
1785     }
1786 
1787     /**
1788      * Indicates whether the cursor is after the last row in
1789      * this rowset's <code>ResultSet</code> object.
1790      *
1791      * @return <code>true</code> if the cursor is after the last row;
1792      * <code>false</code> if the cursor is at any other position or the
1793      * result set contains no rows
1794      * @throws SQLException if a database access error occurs
1795      *            or this rowset does not currently have a valid
1796      *            connection, prepared statement, and result set
1797      */
1798     public boolean isAfterLast() throws SQLException {
1799         checkState();
1800 
1801         return rs.isAfterLast();
1802     }
1803 
1804     /**
1805      * Indicates whether the cursor is on the first row of
1806      * this rowset's <code>ResultSet</code> object.
1807      *
1808      * @return <code>true</code> if the cursor is on the first row;
1809      * <code>false</code> otherwise
1810      * @throws SQLException if a database access error occurs
1811      *            or this rowset does not currently have a valid
1812      *            connection, prepared statement, and result set
1813      */
1814     public boolean isFirst() throws SQLException {
1815         checkState();
1816 
1817         return rs.isFirst();
1818     }
1819 
1820     /**
1821      * Indicates whether the cursor is on the last row of
1822      * this rowset's <code>ResultSet</code> object.
1823      * Note: Calling the method <code>isLast</code> may be expensive
1824      * because the JDBC driver
1825      * might need to fetch ahead one row in order to determine
1826      * whether the current row is the last row in the result set.
1827      *
1828      * @return <code>true</code> if the cursor is on the last row;
1829      * <code>false</code> otherwise
1830      * @throws SQLException if a database access error occurs
1831      *            or this rowset does not currently have a valid
1832      *            connection, prepared statement, and result set
1833      *
1834      */
1835     public boolean isLast() throws SQLException {
1836         checkState();
1837 
1838         return rs.isLast();
1839     }
1840 
1841     /**
1842      * Moves the cursor to the front of
1843      * this rowset's <code>ResultSet</code> object, just before the
1844      * first row. This method has no effect if the result set contains no rows.
1845      *
1846      * @throws SQLException if (1) a database access error occurs,
1847      *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
1848      *            or (3) this rowset does not currently have a valid
1849      *            connection, prepared statement, and result set
1850      */
1851     public void beforeFirst() throws SQLException {
1852         checkState();
1853 
1854         rs.beforeFirst();
1855         notifyCursorMoved();
1856     }
1857 
1858     /**
1859      * Moves the cursor to the end of
1860      * this rowset's <code>ResultSet</code> object, just after the
1861      * last row. This method has no effect if the result set contains no rows.
1862      * @throws SQLException if (1) a database access error occurs,
1863      *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
1864      *            or (3) this rowset does not currently have a valid
1865      *            connection, prepared statement, and result set
1866      */
1867     public void afterLast() throws SQLException {
1868         checkState();
1869 
1870         rs.afterLast();
1871         notifyCursorMoved();
1872     }
1873 
1874     /**
1875      * Moves the cursor to the first row in
1876      * this rowset's <code>ResultSet</code> object.
1877      *
1878      * @return <code>true</code> if the cursor is on a valid row;
1879      * <code>false</code> if there are no rows in the result set
1880      * @throws SQLException if (1) a database access error occurs,
1881      *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
1882      *            or (3) this rowset does not currently have a valid
1883      *            connection, prepared statement, and result set
1884      */
1885     public boolean first() throws SQLException {
1886         checkState();
1887 
1888         boolean b = rs.first();
1889         notifyCursorMoved();
1890         return b;
1891 
1892     }
1893 
1894     /**
1895      * Moves the cursor to the last row in
1896      * this rowset's <code>ResultSet</code> object.
1897      *
1898      * @return <code>true</code> if the cursor is on a valid row;
1899      * <code>false</code> if there are no rows in the result set
1900      * @throws SQLException if (1) a database access error occurs,
1901      *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
1902      *            or (3) this rowset does not currently have a valid
1903      *            connection, prepared statement, and result set
1904      */
1905     public boolean last() throws SQLException {
1906         checkState();
1907 
1908         boolean b = rs.last();
1909         notifyCursorMoved();
1910         return b;
1911     }
1912 
1913     /**
1914      * Retrieves the current row number.  The first row is number 1, the
1915      * second is number 2, and so on.
1916      *
1917      * @return the current row number; <code>0</code> if there is no current row
1918      * @throws SQLException if a database access error occurs
1919      *            or this rowset does not currently have a valid connection,
1920      *            prepared statement, and result set
1921      */
1922     public int getRow() throws SQLException {
1923         checkState();
1924 
1925         return rs.getRow();
1926     }
1927 
1928     /**
1929      * Moves the cursor to the given row number in
1930      * this rowset's internal <code>ResultSet</code> object.
1931      *
1932      * <p>If the row number is positive, the cursor moves to
1933      * the given row number with respect to the
1934      * beginning of the result set.  The first row is row 1, the second
1935      * is row 2, and so on.
1936      *
1937      * <p>If the given row number is negative, the cursor moves to
1938      * an absolute row position with respect to
1939      * the end of the result set.  For example, calling the method
1940      * <code>absolute(-1)</code> positions the
1941      * cursor on the last row, calling the method <code>absolute(-2)</code>
1942      * moves the cursor to the next-to-last row, and so on.
1943      *
1944      * <p>An attempt to position the cursor beyond the first/last row in
1945      * the result set leaves the cursor before the first row or after
1946      * the last row.
1947      *
1948      * <p><B>Note:</B> Calling <code>absolute(1)</code> is the same
1949      * as calling <code>first()</code>. Calling <code>absolute(-1)</code>
1950      * is the same as calling <code>last()</code>.
1951      *
1952      * @return <code>true</code> if the cursor is on the result set;
1953      * <code>false</code> otherwise
1954      * @throws SQLException if (1) a database access error occurs,
1955      *            (2) the row is <code>0</code>, (3) the result set
1956      *            type is <code>TYPE_FORWARD_ONLY</code>, or (4) this
1957      *            rowset does not currently have a valid connection,
1958      *            prepared statement, and result set
1959      */
1960     public boolean absolute(int row) throws SQLException {
1961         checkState();
1962 
1963         boolean b = rs.absolute(row);
1964         notifyCursorMoved();
1965         return b;
1966     }
1967 
1968     /**
1969      * Moves the cursor a relative number of rows, either positive or negative.
1970      * Attempting to move beyond the first/last row in the
1971      * result set positions the cursor before/after the
1972      * the first/last row. Calling <code>relative(0)</code> is valid, but does
1973      * not change the cursor position.
1974      *
1975      * <p>Note: Calling the method <code>relative(1)</code>
1976      * is different from calling the method <code>next()</code>
1977      * because is makes sense to call <code>next()</code> when there
1978      * is no current row,
1979      * for example, when the cursor is positioned before the first row
1980      * or after the last row of the result set.
1981      *
1982      * @return <code>true</code> if the cursor is on a row;
1983      * <code>false</code> otherwise
1984      * @throws SQLException if (1) a database access error occurs,
1985      *            (2) there is no current row, (3) the result set
1986      *            type is <code>TYPE_FORWARD_ONLY</code>, or (4) this
1987      *            rowset does not currently have a valid connection,
1988      *            prepared statement, and result set
1989      */
1990     public boolean relative(int rows) throws SQLException {
1991         checkState();
1992 
1993         boolean b = rs.relative(rows);
1994         notifyCursorMoved();
1995         return b;
1996     }
1997 
1998     /**
1999      * Moves the cursor to the previous row in this
2000      * <code>ResultSet</code> object.
2001      *
2002      * <p><B>Note:</B> Calling the method <code>previous()</code> is not the same as
2003      * calling the method <code>relative(-1)</code> because it
2004      * makes sense to call <code>previous()</code> when there is no current row.
2005      *
2006      * @return <code>true</code> if the cursor is on a valid row;
2007      * <code>false</code> if it is off the result set
2008      * @throws SQLException if (1) a database access error occurs,
2009      *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
2010      *            or (3) this rowset does not currently have a valid
2011      *            connection, prepared statement, and result set
2012      */
2013     public boolean previous() throws SQLException {
2014         checkState();
2015 
2016         boolean b = rs.previous();
2017         notifyCursorMoved();
2018         return b;
2019     }
2020 
2021     /**
2022      * Gives a hint as to the direction in which the rows in this
2023      * <code>ResultSet</code> object will be processed.
2024      * The initial value is determined by the
2025      * <code>Statement</code> object
2026      * that produced this rowset's <code>ResultSet</code> object.
2027      * The fetch direction may be changed at any time.
2028      *
2029      * @throws SQLException if (1) a database access error occurs,
2030      *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>
2031      *            and the fetch direction is not <code>FETCH_FORWARD</code>,
2032      *            or (3) this rowset does not currently have a valid
2033      *            connection, prepared statement, and result set
2034      * @see java.sql.Statement#setFetchDirection
2035      */
2036     public void setFetchDirection(int direction) throws SQLException {
2037         checkState();
2038 
2039         rs.setFetchDirection(direction);
2040     }
2041 
2042     /**
2043      * Returns the fetch direction for this
2044      * <code>ResultSet</code> object.
2045      *
2046      * @return the current fetch direction for this rowset's
2047      *         <code>ResultSet</code> object
2048      * @throws SQLException if a database access error occurs
2049      *            or this rowset does not currently have a valid connection,
2050      *            prepared statement, and result set
2051      */
2052     public int getFetchDirection() throws SQLException {
2053         try {
2054              checkState();
2055         } catch(SQLException sqle) {
2056              super.getFetchDirection();
2057         }
2058         return rs.getFetchDirection();
2059     }
2060 
2061     /**
2062      * Gives the JDBC driver a hint as to the number of rows that should
2063      * be fetched from the database when more rows are needed for this
2064      * <code>ResultSet</code> object.
2065      * If the fetch size specified is zero, the JDBC driver
2066      * ignores the value and is free to make its own best guess as to what
2067      * the fetch size should be.  The default value is set by the
2068      * <code>Statement</code> object
2069      * that created the result set.  The fetch size may be changed at any time.
2070      *
2071      * @param rows the number of rows to fetch
2072      * @throws SQLException if (1) a database access error occurs, (2) the
2073      *            condition <code>0 <= rows <= this.getMaxRows()</code> is not
2074      *            satisfied, or (3) this rowset does not currently have a valid
2075      *            connection, prepared statement, and result set
2076      *
2077      */
2078     public void setFetchSize(int rows) throws SQLException {
2079         checkState();
2080 
2081         rs.setFetchSize(rows);
2082     }
2083 
2084     /**
2085      *
2086      * Returns the fetch size for this
2087      * <code>ResultSet</code> object.
2088      *
2089      * @return the current fetch size for this rowset's <code>ResultSet</code> object
2090      * @throws SQLException if a database access error occurs
2091      *            or this rowset does not currently have a valid connection,
2092      *            prepared statement, and result set
2093      */
2094     public int getType() throws SQLException {
2095         try {
2096              checkState();
2097         } catch(SQLException sqle) {
2098             return super.getType();
2099         }
2100 
2101         // If the ResultSet has not been created, then return the default type
2102         // otherwise return the type from the ResultSet.
2103         if(rs == null) {
2104             return super.getType();
2105         } else {
2106            int rstype = rs.getType();
2107             return rstype;
2108         }
2109 
2110 
2111     }
2112 
2113     /**
2114      * Returns the concurrency mode of this rowset's <code>ResultSet</code> object.
2115      * The concurrency used is determined by the
2116      * <code>Statement</code> object that created the result set.
2117      *
2118      * @return the concurrency type, either <code>CONCUR_READ_ONLY</code>
2119      * or <code>CONCUR_UPDATABLE</code>
2120      * @throws SQLException if (1) a database access error occurs
2121      *            or (2) this rowset does not currently have a valid connection,
2122      *            prepared statement, and result set
2123      */
2124     public int getConcurrency() throws SQLException {
2125         try {
2126              checkState();
2127         } catch(SQLException sqle) {
2128              super.getConcurrency();
2129         }
2130         return rs.getConcurrency();
2131     }
2132 
2133     //---------------------------------------------------------------------
2134     // Updates
2135     //---------------------------------------------------------------------
2136 
2137     /**
2138      * Indicates whether the current row has been updated.  The value returned
2139      * depends on whether or not the result set can detect updates.
2140      *
2141      * @return <code>true</code> if the row has been visibly updated
2142      * by the owner or another, and updates are detected
2143      * @throws SQLException if a database access error occurs
2144      *            or this rowset does not currently have a valid connection,
2145      *            prepared statement, and result set
2146      * @see java.sql.DatabaseMetaData#updatesAreDetected
2147      */
2148     public boolean rowUpdated() throws SQLException {
2149         checkState();
2150 
2151         return rs.rowUpdated();
2152     }
2153 
2154     /**
2155      * Indicates whether the current row has had an insertion.
2156      * The value returned depends on whether or not this
2157      * <code>ResultSet</code> object can detect visible inserts.
2158      *
2159      * @return <code>true</code> if a row has had an insertion
2160      * and insertions are detected; <code>false</code> otherwise
2161      * @throws SQLException if a database access error occurs
2162      *            or this rowset does not currently have a valid connection,
2163      *            prepared statement, and result set
2164      * @see java.sql.DatabaseMetaData#insertsAreDetected
2165      *
2166      */
2167     public boolean rowInserted() throws SQLException {
2168         checkState();
2169 
2170         return rs.rowInserted();
2171     }
2172 
2173     /**
2174      * Indicates whether a row has been deleted.  A deleted row may leave
2175      * a visible "hole" in a result set.  This method can be used to
2176      * detect holes in a result set.  The value returned depends on whether
2177      * or not this rowset's <code>ResultSet</code> object can detect deletions.
2178      *
2179      * @return <code>true</code> if a row was deleted and deletions are detected;
2180      * <code>false</code> otherwise
2181      * @throws SQLException if a database access error occurs
2182      *            or this rowset does not currently have a valid connection,
2183      *            prepared statement, and result set
2184      * @see java.sql.DatabaseMetaData#deletesAreDetected
2185      */
2186     public boolean rowDeleted() throws SQLException {
2187         checkState();
2188 
2189         return rs.rowDeleted();
2190     }
2191 
2192     /**
2193      * Gives a nullable column a null value.
2194      *
2195      * The <code>updateXXX</code> methods are used to update column values in the
2196      * current row or the insert row.  The <code>updateXXX</code> methods do not
2197      * update the underlying database; instead the <code>updateRow</code>
2198      * or <code>insertRow</code> methods are called to update the database.
2199      *
2200      * @param columnIndex the first column is 1, the second is 2, and so on
2201      * @throws SQLException if a database access error occurs
2202      *            or this rowset does not currently have a valid connection,
2203      *            prepared statement, and result set
2204      */
2205     public void updateNull(int columnIndex) throws SQLException {
2206         checkState();
2207 
2208         // To check the type and concurrency of the ResultSet
2209         // to verify whether updates are possible or not
2210         checkTypeConcurrency();
2211 
2212         rs.updateNull(columnIndex);
2213     }
2214 
2215     /**
2216      * Updates the designated column with a <code>boolean</code> value.
2217      * The <code>updateXXX</code> methods are used to update column values in the
2218      * current row or the insert row.  The <code>updateXXX</code> methods do not
2219      * update the underlying database; instead the <code>updateRow</code> or
2220      * <code>insertRow</code> methods are called to update the database.
2221      *
2222      * @param columnIndex the first column is 1, the second is 2, and so on
2223      * @param x the new column value
2224      * @throws SQLException if a database access error occurs
2225      *            or this rowset does not currently have a valid connection,
2226      *            prepared statement, and result set
2227      *
2228      */
2229     public void updateBoolean(int columnIndex, boolean x) throws SQLException {
2230         checkState();
2231 
2232         // To check the type and concurrency of the ResultSet
2233         // to verify whether updates are possible or not
2234         checkTypeConcurrency();
2235 
2236         rs.updateBoolean(columnIndex, x);
2237     }
2238 
2239     /**
2240      * Updates the designated column with a <code>byte</code> value.
2241      * The <code>updateXXX</code> methods are used to update column values in the
2242      * current row or the insert row.  The <code>updateXXX</code> methods do not
2243      * update the underlying database; instead the <code>updateRow</code> or
2244      * <code>insertRow</code> methods are called to update the database.
2245      *
2246      *
2247      * @param columnIndex the first column is 1, the second is 2, and so on
2248      * @param x the new column value
2249      * @throws SQLException if a database access error occurs
2250      *            or this rowset does not currently have a valid connection,
2251      *            prepared statement, and result set
2252      *
2253      */
2254     public void updateByte(int columnIndex, byte x) throws SQLException {
2255         checkState();
2256 
2257         // To check the type and concurrency of the ResultSet
2258         // to verify whether updates are possible or not
2259         checkTypeConcurrency();
2260 
2261         rs.updateByte(columnIndex, x);
2262     }
2263 
2264     /**
2265      * Updates the designated column with a <code>short</code> value.
2266      * The <code>updateXXX</code> methods are used to update column values in the
2267      * current row or the insert row.  The <code>updateXXX</code> methods do not
2268      * update the underlying database; instead the <code>updateRow</code> or
2269      * <code>insertRow</code> methods are called to update the database.
2270      *
2271      * @param columnIndex the first column is 1, the second is 2, and so on
2272      * @param x the new column value
2273      * @throws SQLException if a database access error occurs
2274      *            or this rowset does not currently have a valid connection,
2275      *            prepared statement, and result set
2276      *
2277      */
2278     public void updateShort(int columnIndex, short x) throws SQLException {
2279         checkState();
2280 
2281         // To check the type and concurrency of the ResultSet
2282         // to verify whether updates are possible or not
2283         checkTypeConcurrency();
2284 
2285         rs.updateShort(columnIndex, x);
2286     }
2287 
2288     /**
2289      * Updates the designated column with an <code>int</code> value.
2290      * The <code>updateXXX</code> methods are used to update column values in the
2291      * current row or the insert row.  The <code>updateXXX</code> methods do not
2292      * update the underlying database; instead the <code>updateRow</code> or
2293      * <code>insertRow</code> methods are called to update the database.
2294      *
2295      * @param columnIndex the first column is 1, the second is 2, and so on
2296      * @param x the new column value
2297      * @throws SQLException if a database access error occurs
2298      *            or this rowset does not currently have a valid connection,
2299      *            prepared statement, and result set
2300      */
2301     public void updateInt(int columnIndex, int x) throws SQLException {
2302         checkState();
2303 
2304         // To check the type and concurrency of the ResultSet
2305         // to verify whether updates are possible or not
2306         checkTypeConcurrency();
2307 
2308         rs.updateInt(columnIndex, x);
2309     }
2310 
2311     /**
2312      * Updates the designated column with a <code>long</code> value.
2313      * The <code>updateXXX</code> methods are used to update column values in the
2314      * current row or the insert row.  The <code>updateXXX</code> methods do not
2315      * update the underlying database; instead the <code>updateRow</code> or
2316      * <code>insertRow</code> methods are called to update the database.
2317      *
2318      * @param columnIndex the first column is 1, the second is 2, and so on
2319      * @param x the new column value
2320      * @throws SQLException if a database access error occurs
2321      *            or this rowset does not currently have a valid connection,
2322      *            prepared statement, and result set
2323      *
2324      */
2325     public void updateLong(int columnIndex, long x) throws SQLException {
2326         checkState();
2327 
2328         // To check the type and concurrency of the ResultSet
2329         // to verify whether updates are possible or not
2330         checkTypeConcurrency();
2331 
2332         rs.updateLong(columnIndex, x);
2333     }
2334 
2335     /**
2336      * Updates the designated column with a <code>float</code> value.
2337      * The <code>updateXXX</code> methods are used to update column values in the
2338      * current row or the insert row.  The <code>updateXXX</code> methods do not
2339      * update the underlying database; instead the <code>updateRow</code> or
2340      * <code>insertRow</code> methods are called to update the database.
2341      *
2342      * @param columnIndex the first column is 1, the second is 2, and so on
2343      * @param x the new column value
2344      * @throws SQLException if a database access error occurs
2345      *            or this rowset does not currently have a valid connection,
2346      *            prepared statement, and result set
2347      *
2348      */
2349     public void updateFloat(int columnIndex, float x) throws SQLException {
2350         checkState();
2351 
2352         // To check the type and concurrency of the ResultSet
2353         // to verify whether updates are possible or not
2354         checkTypeConcurrency();
2355 
2356         rs.updateFloat(columnIndex, x);
2357     }
2358 
2359     /**
2360      * Updates the designated column with a <code>double</code> value.
2361      * The <code>updateXXX</code> methods are used to update column values in the
2362      * current row or the insert row.  The <code>updateXXX</code> methods do not
2363      * update the underlying database; instead the <code>updateRow</code> or
2364      * <code>insertRow</code> methods are called to update the database.
2365      *
2366      * @param columnIndex the first column is 1, the second is 2, and so on
2367      * @param x the new column value
2368      * @throws SQLException if a database access error occurs
2369      *            or this rowset does not currently have a valid connection,
2370      *            prepared statement, and result set
2371      *
2372      */
2373     public void updateDouble(int columnIndex, double x) throws SQLException {
2374         checkState();
2375 
2376         // To check the type and concurrency of the ResultSet
2377         // to verify whether updates are possible or not
2378         checkTypeConcurrency();
2379 
2380         rs.updateDouble(columnIndex, x);
2381     }
2382 
2383     /**
2384      * Updates the designated column with a <code>java.math.BigDecimal</code>
2385      * value.
2386      * The <code>updateXXX</code> methods are used to update column values in the
2387      * current row or the insert row.  The <code>updateXXX</code> methods do not
2388      * update the underlying database; instead the <code>updateRow</code> or
2389      * <code>insertRow</code> methods are called to update the database.
2390      *
2391      * @param columnIndex the first column is 1, the second is 2, and so on
2392      * @param x the new column value
2393      * @throws SQLException if a database access error occurs
2394      *            or this rowset does not currently have a valid connection,
2395      *            prepared statement, and result set
2396      *
2397      */
2398     public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
2399         checkState();
2400 
2401         // To check the type and concurrency of the ResultSet
2402         // to verify whether updates are possible or not
2403         checkTypeConcurrency();
2404 
2405         rs.updateBigDecimal(columnIndex, x);
2406     }
2407 
2408     /**
2409      * Updates the designated column with a <code>String</code> value.
2410      * The <code>updateXXX</code> methods are used to update column values in the
2411      * current row or the insert row.  The <code>updateXXX</code> methods do not
2412      * update the underlying database; instead the <code>updateRow</code> or
2413      * <code>insertRow</code> methods are called to update the database.
2414      *
2415      * @param columnIndex the first column is 1, the second is 2, and so on
2416      * @param x the new column value
2417      * @throws SQLException if a database access error occurs
2418      *            or this rowset does not currently have a valid connection,
2419      *            prepared statement, and result set
2420      *
2421      */
2422     public void updateString(int columnIndex, String x) throws SQLException {
2423         checkState();
2424 
2425         // To check the type and concurrency of the ResultSet
2426         // to verify whether updates are possible or not
2427         checkTypeConcurrency();
2428 
2429         rs.updateString(columnIndex, x);
2430     }
2431 
2432     /**
2433      * Updates the designated column with a <code>byte</code> array value.
2434      * The <code>updateXXX</code> methods are used to update column values in the
2435      * current row or the insert row.  The <code>updateXXX</code> methods do not
2436      * update the underlying database; instead the <code>updateRow</code> or
2437      * <code>insertRow</code> methods are called to update the database.
2438      *
2439      * @param columnIndex the first column is 1, the second is 2, and so on
2440      * @param x the new column value
2441      * @throws SQLException if a database access error occurs
2442      *            or this rowset does not currently have a valid connection,
2443      *            prepared statement, and result set
2444      *
2445      */
2446     public void updateBytes(int columnIndex, byte x[]) throws SQLException {
2447         checkState();
2448 
2449         // To check the type and concurrency of the ResultSet
2450         // to verify whether updates are possible or not
2451         checkTypeConcurrency();
2452 
2453         rs.updateBytes(columnIndex, x);
2454     }
2455 
2456     /**
2457      * Updates the designated column with a <code>java.sql.Date</code> value.
2458      * The <code>updateXXX</code> methods are used to update column values in the
2459      * current row or the insert row.  The <code>updateXXX</code> methods do not
2460      * update the underlying database; instead the <code>updateRow</code> or
2461      * <code>insertRow</code> methods are called to update the database.
2462      *
2463      * @param columnIndex the first column is 1, the second is 2, and so on
2464      * @param x the new column value
2465      * @throws SQLException if a database access error occurs
2466      *            or this rowset does not currently have a valid connection,
2467      *            prepared statement, and result set
2468      *
2469      */
2470     public void updateDate(int columnIndex, java.sql.Date x) throws SQLException {
2471         checkState();
2472 
2473         // To check the type and concurrency of the ResultSet
2474         // to verify whether updates are possible or not
2475         checkTypeConcurrency();
2476 
2477         rs.updateDate(columnIndex, x);
2478     }
2479 
2480 
2481     /**
2482      * Updates the designated column with a <code>java.sql.Time</code> value.
2483      * The <code>updateXXX</code> methods are used to update column values in the
2484      * current row or the insert row.  The <code>updateXXX</code> methods do not
2485      * update the underlying database; instead the <code>updateRow</code> or
2486      * <code>insertRow</code> methods are called to update the database.
2487      *
2488      * @param columnIndex the first column is 1, the second is 2, and so on
2489      * @param x the new column value
2490      * @throws SQLException if a database access error occurs
2491      *            or this rowset does not currently have a valid connection,
2492      *            prepared statement, and result set
2493      *
2494      */
2495     public void updateTime(int columnIndex, java.sql.Time x) throws SQLException {
2496         checkState();
2497 
2498         // To check the type and concurrency of the ResultSet
2499         // to verify whether updates are possible or not
2500         checkTypeConcurrency();
2501 
2502         rs.updateTime(columnIndex, x);
2503     }
2504 
2505     /**
2506      * Updates the designated column with a <code>java.sql.Timestamp</code>
2507      * value.
2508      * The <code>updateXXX</code> methods are used to update column values in the
2509      * current row or the insert row.  The <code>updateXXX</code> methods do not
2510      * update the underlying database; instead the <code>updateRow</code> or
2511      * <code>insertRow</code> methods are called to update the database.
2512      *
2513      * @param columnIndex the first column is 1, the second is 2, and so on
2514      * @param x the new column value
2515      * @throws SQLException if a database access error occurs
2516      *            or this rowset does not currently have a valid connection,
2517      *            prepared statement, and result set
2518      *
2519      */
2520     public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException {
2521         checkState();
2522 
2523         // To check the type and concurrency of the ResultSet
2524         // to verify whether updates are possible or not
2525         checkTypeConcurrency();
2526 
2527         rs.updateTimestamp(columnIndex, x);
2528     }
2529 
2530     /**
2531      * Updates the designated column with an ascii stream value.
2532      * The <code>updateXXX</code> methods are used to update column values in the
2533      * current row or the insert row.  The <code>updateXXX</code> methods do not
2534      * update the underlying database; instead the <code>updateRow</code> or
2535      * <code>insertRow</code> methods are called to update the database.
2536      *
2537      * @param columnIndex the first column is 1, the second is 2, and so on
2538      * @param x the new column value
2539      * @param length the length of the stream
2540      * @throws SQLException if (1) a database access error occurs
2541      *            (2) or this rowset does not currently have a valid connection,
2542      *            prepared statement, and result set
2543      *
2544      */
2545     public void updateAsciiStream(int columnIndex, java.io.InputStream x, int length) throws SQLException {
2546         checkState();
2547 
2548         // To check the type and concurrency of the ResultSet
2549         // to verify whether updates are possible or not
2550         checkTypeConcurrency();
2551 
2552         rs.updateAsciiStream(columnIndex, x, length);
2553     }
2554 
2555     /**
2556      * Updates the designated column with a binary stream value.
2557      * The <code>updateXXX</code> methods are used to update column values in the
2558      * current row or the insert row.  The <code>updateXXX</code> methods do not
2559      * update the underlying database; instead the <code>updateRow</code> or
2560      * <code>insertRow</code> methods are called to update the database.
2561      *
2562      * @param columnIndex the first column is 1, the second is 2, and so on
2563      * @param x the new column value
2564      * @param length the length of the stream
2565      * @throws SQLException if a database access error occurs
2566      *            or this rowset does not currently have a valid connection,
2567      *            prepared statement, and result set
2568      *
2569      */
2570     public void updateBinaryStream(int columnIndex, java.io.InputStream x, int length) throws SQLException {
2571         checkState();
2572 
2573         // To check the type and concurrency of the ResultSet
2574         // to verify whether updates are possible or not
2575         checkTypeConcurrency();
2576 
2577         rs.updateBinaryStream(columnIndex, x, length);
2578     }
2579 
2580     /**
2581      * Updates the designated column with a character stream value.
2582      * The <code>updateXXX</code> methods are used to update column values in the
2583      * current row or the insert row.  The <code>updateXXX</code> methods do not
2584      * update the underlying database; instead the <code>updateRow</code> or
2585      * <code>insertRow</code> methods are called to update the database.
2586      *
2587      * @param columnIndex the first column is 1, the second is 2, and so on
2588      * @param x the new column value
2589      * @param length the length of the stream
2590      * @throws SQLException if a database access error occurs
2591      *            or this rowset does not currently have a valid connection,
2592      *            prepared statement, and result set
2593      *
2594      */
2595     public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException {
2596         checkState();
2597 
2598         // To check the type and concurrency of the ResultSet
2599         // to verify whether updates are possible or not
2600         checkTypeConcurrency();
2601 
2602         rs.updateCharacterStream(columnIndex, x, length);
2603     }
2604 
2605     /**
2606      * Updates the designated column with an <code>Object</code> value.
2607      * The <code>updateXXX</code> methods are used to update column values in the
2608      * current row or the insert row.  The <code>updateXXX</code> methods do not
2609      * update the underlying database; instead the <code>updateRow</code> or
2610      * <code>insertRow</code> methods are called to update the database.
2611      *
2612      * @param columnIndex the first column is 1, the second is 2, and so on
2613      * @param x the new column value
2614      * @param scale for <code>java.sql.Types.DECIMAl</code>
2615      *  or <code>java.sql.Types.NUMERIC</code> types,
2616      *  this is the number of digits after the decimal point.  For all other
2617      *  types this value will be ignored.
2618      * @throws SQLException if a database access error occurs
2619      *            or this rowset does not currently have a valid connection,
2620      *            prepared statement, and result set
2621      *
2622      */
2623     public void updateObject(int columnIndex, Object x, int scale) throws SQLException {
2624         checkState();
2625 
2626         // To check the type and concurrency of the ResultSet
2627         // to verify whether updates are possible or not
2628         checkTypeConcurrency();
2629 
2630         rs.updateObject(columnIndex, x, scale);
2631     }
2632 
2633     /**
2634      * Updates the designated column with an <code>Object</code> value.
2635      * The <code>updateXXX</code> methods are used to update column values in the
2636      * current row or the insert row.  The <code>updateXXX</code> methods do not
2637      * update the underlying database; instead the <code>updateRow</code> or
2638      * <code>insertRow</code> methods are called to update the database.
2639      *
2640      * @param columnIndex the first column is 1, the second is 2, and so on
2641      * @param x the new column value
2642      * @throws SQLException if a database access error occurs
2643      *            or this rowset does not currently have a valid connection,
2644      *            prepared statement, and result set
2645      *
2646      */
2647     public void updateObject(int columnIndex, Object x) throws SQLException {
2648         checkState();
2649 
2650         // To check the type and concurrency of the ResultSet
2651         // to verify whether updates are possible or not
2652         checkTypeConcurrency();
2653 
2654         rs.updateObject(columnIndex, x);
2655     }
2656 
2657     /**
2658      * Updates the designated column with a <code>null</code> value.
2659      * The <code>updateXXX</code> methods are used to update column values in the
2660      * current row or the insert row.  The <code>updateXXX</code> methods do not
2661      * update the underlying database; instead the <code>updateRow</code> or
2662      * <code>insertRow</code> methods are called to update the database.
2663      *
2664      * @param columnName the name of the column
2665      * @throws SQLException if a database access error occurs
2666      *            or this rowset does not currently have a valid connection,
2667      *            prepared statement, and result set
2668      *
2669      */
2670     public void updateNull(String columnName) throws SQLException {
2671         updateNull(findColumn(columnName));
2672     }
2673 
2674     /**
2675      * Updates the designated column with a <code>boolean</code> value.
2676      * The <code>updateXXX</code> methods are used to update column values in the
2677      * current row or the insert row.  The <code>updateXXX</code> methods do not
2678      * update the underlying database; instead the <code>updateRow</code> or
2679      * <code>insertRow</code> methods are called to update the database.
2680      *
2681      * @param columnName the name of the column
2682      * @param x the new column value
2683      * @throws SQLException if a database access error occurs
2684      *
2685      */
2686     public void updateBoolean(String columnName, boolean x) throws SQLException {
2687         updateBoolean(findColumn(columnName), x);
2688     }
2689 
2690     /**
2691      * Updates the designated column with a <code>byte</code> value.
2692      * The <code>updateXXX</code> methods are used to update column values in the
2693      * current row or the insert row.  The <code>updateXXX</code> methods do not
2694      * update the underlying database; instead the <code>updateRow</code> or
2695      * <code>insertRow</code> methods are called to update the database.
2696      *
2697      * @param columnName the name of the column
2698      * @param x the new column value
2699      * @throws SQLException if a database access error occurs
2700      *
2701      */
2702     public void updateByte(String columnName, byte x) throws SQLException {
2703         updateByte(findColumn(columnName), x);
2704     }
2705 
2706     /**
2707      * Updates the designated column with a <code>short</code> value.
2708      * The <code>updateXXX</code> methods are used to update column values in the
2709      * current row or the insert row.  The <code>updateXXX</code> methods do not
2710      * update the underlying database; instead the <code>updateRow</code> or
2711      * <code>insertRow</code> methods are called to update the database.
2712      *
2713      * @param columnName the name of the column
2714      * @param x the new column value
2715      * @throws SQLException if a database access error occurs
2716      *
2717      */
2718     public void updateShort(String columnName, short x) throws SQLException {
2719         updateShort(findColumn(columnName), x);
2720     }
2721 
2722     /**
2723      * Updates the designated column with an <code>int</code> value.
2724      * The <code>updateXXX</code> methods are used to update column values in the
2725      * current row or the insert row.  The <code>updateXXX</code> methods do not
2726      * update the underlying database; instead the <code>updateRow</code> or
2727      * <code>insertRow</code> methods are called to update the database.
2728      *
2729      * @param columnName the name of the column
2730      * @param x the new column value
2731      * @throws SQLException if a database access error occurs
2732      *
2733      */
2734     public void updateInt(String columnName, int x) throws SQLException {
2735         updateInt(findColumn(columnName), x);
2736     }
2737 
2738     /**
2739      * Updates the designated column with a <code>long</code> value.
2740      * The <code>updateXXX</code> methods are used to update column values in the
2741      * current row or the insert row.  The <code>updateXXX</code> methods do not
2742      * update the underlying database; instead the <code>updateRow</code> or
2743      * <code>insertRow</code> methods are called to update the database.
2744      *
2745      * @param columnName the name of the column
2746      * @param x the new column value
2747      * @throws SQLException if a database access error occurs
2748      *
2749      */
2750     public void updateLong(String columnName, long x) throws SQLException {
2751         updateLong(findColumn(columnName), x);
2752     }
2753 
2754     /**
2755      * Updates the designated column with a <code>float </code> value.
2756      * The <code>updateXXX</code> methods are used to update column values in the
2757      * current row or the insert row.  The <code>updateXXX</code> methods do not
2758      * update the underlying database; instead the <code>updateRow</code> or
2759      * <code>insertRow</code> methods are called to update the database.
2760      *
2761      * @param columnName the name of the column
2762      * @param x the new column value
2763      * @throws SQLException if a database access error occurs
2764      *
2765      */
2766     public void updateFloat(String columnName, float x) throws SQLException {
2767         updateFloat(findColumn(columnName), x);
2768     }
2769 
2770     /**
2771      * Updates the designated column with a <code>double</code> value.
2772      * The <code>updateXXX</code> methods are used to update column values in the
2773      * current row or the insert row.  The <code>updateXXX</code> methods do not
2774      * update the underlying database; instead the <code>updateRow</code> or
2775      * <code>insertRow</code> methods are called to update the database.
2776      *
2777      * @param columnName the name of the column
2778      * @param x the new column value
2779      * @throws SQLException if a database access error occurs
2780      *
2781      */
2782     public void updateDouble(String columnName, double x) throws SQLException {
2783         updateDouble(findColumn(columnName), x);
2784     }
2785 
2786     /**
2787      * Updates the designated column with a <code>java.sql.BigDecimal</code>
2788      * value.
2789      * The <code>updateXXX</code> methods are used to update column values in the
2790      * current row or the insert row.  The <code>updateXXX</code> methods do not
2791      * update the underlying database; instead the <code>updateRow</code> or
2792      * <code>insertRow</code> methods are called to update the database.
2793      *
2794      * @param columnName the name of the column
2795      * @param x the new column value
2796      * @throws SQLException if a database access error occurs
2797      *
2798      */
2799     public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException {
2800         updateBigDecimal(findColumn(columnName), x);
2801     }
2802 
2803     /**
2804      * Updates the designated column with a <code>String</code> value.
2805      * The <code>updateXXX</code> methods are used to update column values in the
2806      * current row or the insert row.  The <code>updateXXX</code> methods do not
2807      * update the underlying database; instead the <code>updateRow</code> or
2808      * <code>insertRow</code> methods are called to update the database.
2809      *
2810      * @param columnName the name of the column
2811      * @param x the new column value
2812      * @throws SQLException if a database access error occurs
2813      *
2814      */
2815     public void updateString(String columnName, String x) throws SQLException {
2816         updateString(findColumn(columnName), x);
2817     }
2818 
2819     /**
2820      * Updates the designated column with a <code>boolean</code> value.
2821      * The <code>updateXXX</code> methods are used to update column values in the
2822      * current row or the insert row.  The <code>updateXXX</code> methods do not
2823      * update the underlying database; instead the <code>updateRow</code> or
2824      * <code>insertRow</code> methods are called to update the database.
2825      *
2826      * JDBC 2.0
2827      *
2828      * Updates a column with a byte array value.
2829      *
2830      * The <code>updateXXX</code> methods are used to update column values in the
2831      * current row, or the insert row.  The <code>updateXXX</code> methods do not
2832      * update the underlying database; instead the <code>updateRow</code> or <code>insertRow</code>
2833      * methods are called to update the database.
2834      *
2835      * @param columnName the name of the column
2836      * @param x the new column value
2837      * @throws SQLException if a database access error occurs
2838      *
2839      */
2840     public void updateBytes(String columnName, byte x[]) throws SQLException {
2841         updateBytes(findColumn(columnName), x);
2842     }
2843 
2844     /**
2845      * Updates the designated column with a <code>java.sql.Date</code> value.
2846      * The <code>updateXXX</code> methods are used to update column values in the
2847      * current row or the insert row.  The <code>updateXXX</code> methods do not
2848      * update the underlying database; instead the <code>updateRow</code> or
2849      * <code>insertRow</code> methods are called to update the database.
2850      *
2851      * @param columnName the name of the column
2852      * @param x the new column value
2853      * @throws SQLException if a database access error occurs
2854      *
2855      */
2856     public void updateDate(String columnName, java.sql.Date x) throws SQLException {
2857         updateDate(findColumn(columnName), x);
2858     }
2859 
2860     /**
2861      * Updates the designated column with a <code>java.sql.Time</code> value.
2862      * The <code>updateXXX</code> methods are used to update column values in the
2863      * current row or the insert row.  The <code>updateXXX</code> methods do not
2864      * update the underlying database; instead the <code>updateRow</code> or
2865      * <code>insertRow</code> methods are called to update the database.
2866      *
2867      * @param columnName the name of the column
2868      * @param x the new column value
2869      * @throws SQLException if a database access error occurs
2870      *
2871      */
2872     public void updateTime(String columnName, java.sql.Time x) throws SQLException {
2873         updateTime(findColumn(columnName), x);
2874     }
2875 
2876     /**
2877      * Updates the designated column with a <code>java.sql.Timestamp</code>
2878      * value.
2879      * The <code>updateXXX</code> methods are used to update column values in the
2880      * current row or the insert row.  The <code>updateXXX</code> methods do not
2881      * update the underlying database; instead the <code>updateRow</code> or
2882      * <code>insertRow</code> methods are called to update the database.
2883      *
2884      * @param columnName the name of the column
2885      * @param x the new column value
2886      * @throws SQLException if a database access error occurs
2887      *
2888      */
2889     public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException {
2890         updateTimestamp(findColumn(columnName), x);
2891     }
2892 
2893     /**
2894      * Updates the designated column with an ascii stream value.
2895      * The <code>updateXXX</code> methods are used to update column values in the
2896      * current row or the insert row.  The <code>updateXXX</code> methods do not
2897      * update the underlying database; instead the <code>updateRow</code> or
2898      * <code>insertRow</code> methods are called to update the database.
2899      *
2900      * @param columnName the name of the column
2901      * @param x the new column value
2902      * @param length the length of the stream
2903      * @throws SQLException if a database access error occurs
2904      *
2905      */
2906     public void updateAsciiStream(String columnName, java.io.InputStream x, int length) throws SQLException {
2907         updateAsciiStream(findColumn(columnName), x, length);
2908     }
2909 
2910     /**
2911      * Updates the designated column with a binary stream value.
2912      * The <code>updateXXX</code> methods are used to update column values in the
2913      * current row or the insert row.  The <code>updateXXX</code> methods do not
2914      * update the underlying database; instead the <code>updateRow</code> or
2915      * <code>insertRow</code> methods are called to update the database.
2916      *
2917      * @param columnName the name of the column
2918      * @param x the new column value
2919      * @param length the length of the stream
2920      * @throws SQLException if a database access error occurs
2921      *
2922      */
2923     public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException {
2924         updateBinaryStream(findColumn(columnName), x, length);
2925     }
2926 
2927     /**
2928      * Updates the designated column with a character stream value.
2929      * The <code>updateXXX</code> methods are used to update column values
2930      * in the current row or the insert row.  The <code>updateXXX</code>
2931      * methods do not update the underlying database; instead the
2932      * <code>updateRow</code> or <code>insertRow</code> methods are called
2933      * to update the database.
2934      *
2935      * @param columnName the name of the column
2936      * @param reader the new column <code>Reader</code> stream value
2937      * @param length the length of the stream
2938      * @throws SQLException if a database access error occurs
2939      *
2940      */
2941     public void updateCharacterStream(String columnName, java.io.Reader reader, int length) throws SQLException {
2942         updateCharacterStream(findColumn(columnName), reader, length);
2943     }
2944 
2945     /**
2946      * Updates the designated column with an <code>Object</code> value.
2947      * The <code>updateXXX</code> methods are used to update column values in the
2948      * current row or the insert row.  The <code>updateXXX</code> methods do not
2949      * update the underlying database; instead the <code>updateRow</code> or
2950      * <code>insertRow</code> methods are called to update the database.
2951      *
2952      * @param columnName the name of the column
2953      * @param x the new column value
2954      * @param scale for <code>java.sql.Types.DECIMAL</code>
2955      *  or <code>java.sql.Types.NUMERIC</code> types,
2956      *  this is the number of digits after the decimal point.  For all other
2957      *  types this value will be ignored.
2958      * @throws SQLException if a database access error occurs
2959      *
2960      */
2961     public void updateObject(String columnName, Object x, int scale) throws SQLException {
2962         updateObject(findColumn(columnName), x, scale);
2963     }
2964 
2965     /**
2966      * Updates the designated column with an <code>Object</code> value.
2967      * The <code>updateXXX</code> methods are used to update column values in the
2968      * current row or the insert row.  The <code>updateXXX</code> methods do not
2969      * update the underlying database; instead the <code>updateRow</code> or
2970      * <code>insertRow</code> methods are called to update the database.
2971      *
2972      * @param columnName the name of the column
2973      * @param x the new column value
2974      * @throws SQLException if a database access error occurs
2975      *
2976      */
2977     public void updateObject(String columnName, Object x) throws SQLException {
2978         updateObject(findColumn(columnName), x);
2979     }
2980 
2981     /**
2982      * Inserts the contents of the insert row into this
2983      * <code>ResultSet</code> object and into the database
2984      * and also notifies listeners that a row has changed.
2985      * The cursor must be on the insert row when this method is called.
2986      *
2987      * @throws SQLException if (1) a database access error occurs,
2988      *            (2) this method is called when the cursor is not
2989      *             on the insert row, (3) not all non-nullable columns in
2990      *             the insert row have been given a value, or (4) this
2991      *             rowset does not currently have a valid connection,
2992      *             prepared statement, and result set
2993      */
2994     public void insertRow() throws SQLException {
2995         checkState();
2996 
2997         rs.insertRow();
2998         notifyRowChanged();
2999     }
3000 
3001     /**
3002      * Updates the underlying database with the new contents of the
3003      * current row of this rowset's <code>ResultSet</code> object
3004      * and notifies listeners that a row has changed.
3005      * This method cannot be called when the cursor is on the insert row.
3006      *
3007      * @throws SQLException if (1) a database access error occurs,
3008      *            (2) this method is called when the cursor is
3009      *             on the insert row, (3) the concurrency of the result
3010      *             set is <code>ResultSet.CONCUR_READ_ONLY</code>, or
3011      *             (4) this rowset does not currently have a valid connection,
3012      *             prepared statement, and result set
3013      */
3014     public void updateRow() throws SQLException {
3015         checkState();
3016 
3017         rs.updateRow();
3018         notifyRowChanged();
3019     }
3020 
3021     /**
3022      * Deletes the current row from this rowset's <code>ResultSet</code> object
3023      * and from the underlying database and also notifies listeners that a row
3024      * has changed.  This method cannot be called when the cursor is on the insert
3025      * row.
3026      *
3027      * @throws SQLException if a database access error occurs
3028      * or if this method is called when the cursor is on the insert row
3029      * @throws SQLException if (1) a database access error occurs,
3030      *            (2) this method is called when the cursor is before the
3031      *            first row, after the last row, or on the insert row,
3032      *            (3) the concurrency of this rowset's result
3033      *            set is <code>ResultSet.CONCUR_READ_ONLY</code>, or
3034      *            (4) this rowset does not currently have a valid connection,
3035      *            prepared statement, and result set
3036      */
3037     public void deleteRow() throws SQLException {
3038         checkState();
3039 
3040         rs.deleteRow();
3041         notifyRowChanged();
3042     }
3043 
3044     /**
3045      * Refreshes the current row of this rowset's <code>ResultSet</code>
3046      * object with its most recent value in the database.  This method
3047      * cannot be called when the cursor is on the insert row.
3048      *
3049      * <P>The <code>refreshRow</code> method provides a way for an
3050      * application to explicitly tell the JDBC driver to refetch
3051      * a row(s) from the database.  An application may want to call
3052      * <code>refreshRow</code> when caching or prefetching is being
3053      * done by the JDBC driver to fetch the latest value of a row
3054      * from the database.  The JDBC driver may actually refresh multiple
3055      * rows at once if the fetch size is greater than one.
3056      *
3057      * <P> All values are refetched subject to the transaction isolation
3058      * level and cursor sensitivity.  If <code>refreshRow</code> is called after
3059      * calling an <code>updateXXX</code> method, but before calling
3060      * the method <code>updateRow</code>, then the
3061      * updates made to the row are lost.  Calling the method
3062      * <code>refreshRow</code> frequently will likely slow performance.
3063      *
3064      * @throws SQLException if (1) a database access error occurs,
3065      *            (2) this method is called when the cursor is
3066      *             on the insert row, or (3) this rowset does not
3067      *             currently have a valid connection, prepared statement,
3068      *             and result set
3069      *
3070      */
3071     public void refreshRow() throws SQLException {
3072         checkState();
3073 
3074         rs.refreshRow();
3075     }
3076 
3077     /**
3078      * Cancels the updates made to the current row in this
3079      * <code>ResultSet</code> object and notifies listeners that a row
3080      * has changed. This method may be called after calling an
3081      * <code>updateXXX</code> method(s) and before calling
3082      * the method <code>updateRow</code> to roll back
3083      * the updates made to a row.  If no updates have been made or
3084      * <code>updateRow</code> has already been called, this method has no
3085      * effect.
3086      *
3087      * @throws SQLException if (1) a database access error occurs,
3088      *            (2) this method is called when the cursor is
3089      *             on the insert row, or (3) this rowset does not
3090      *             currently have a valid connection, prepared statement,
3091      *             and result set
3092      */
3093     public void cancelRowUpdates() throws SQLException {
3094         checkState();
3095 
3096         rs.cancelRowUpdates();
3097 
3098         notifyRowChanged();
3099     }
3100 
3101     /**
3102      * Moves the cursor to the insert row.  The current cursor position is
3103      * remembered while the cursor is positioned on the insert row.
3104      *
3105      * The insert row is a special row associated with an updatable
3106      * result set.  It is essentially a buffer where a new row may
3107      * be constructed by calling the <code>updateXXX</code> methods prior to
3108      * inserting the row into the result set.
3109      *
3110      * Only the <code>updateXXX</code>, <code>getXXX</code>,
3111      * and <code>insertRow</code> methods may be
3112      * called when the cursor is on the insert row.  All of the columns in
3113      * a result set must be given a value each time this method is
3114      * called before calling <code>insertRow</code>.
3115      * An <code>updateXXX</code> method must be called before a
3116      * <code>getXXX</code> method can be called on a column value.
3117      *
3118      * @throws SQLException if (1) a database access error occurs,
3119      *            (2) this rowset's <code>ResultSet</code> object is
3120      *             not updatable, or (3) this rowset does not
3121      *             currently have a valid connection, prepared statement,
3122      *             and result set
3123      *
3124      */
3125     public void moveToInsertRow() throws SQLException {
3126         checkState();
3127 
3128         rs.moveToInsertRow();
3129     }
3130 
3131     /**
3132      * Moves the cursor to the remembered cursor position, usually the
3133      * current row.  This method has no effect if the cursor is not on
3134      * the insert row.
3135      *
3136      * @throws SQLException if (1) a database access error occurs,
3137      *            (2) this rowset's <code>ResultSet</code> object is
3138      *             not updatable, or (3) this rowset does not
3139      *             currently have a valid connection, prepared statement,
3140      *             and result set
3141      */
3142     public void moveToCurrentRow() throws SQLException {
3143         checkState();
3144 
3145         rs.moveToCurrentRow();
3146     }
3147 
3148     /**
3149      * Returns the <code>Statement</code> object that produced this
3150      * <code>ResultSet</code> object.
3151      * If the result set was generated some other way, such as by a
3152      * <code>DatabaseMetaData</code> method, this method returns
3153      * <code>null</code>.
3154      *
3155      * @return the <code>Statement</code> object that produced
3156      * this rowset's <code>ResultSet</code> object or <code>null</code>
3157      * if the result set was produced some other way
3158      * @throws SQLException if a database access error occurs
3159      */
3160     public java.sql.Statement getStatement() throws SQLException {
3161 
3162         if(rs != null)
3163         {
3164            return rs.getStatement();
3165         } else {
3166            return null;
3167         }
3168     }
3169 
3170     /**
3171      * Returns the value of the designated column in the current row
3172      * of this rowset's <code>ResultSet</code> object as an <code>Object</code>.
3173      * This method uses the given <code>Map</code> object
3174      * for the custom mapping of the
3175      * SQL structured or distinct type that is being retrieved.
3176      *
3177      * @param i the first column is 1, the second is 2, and so on
3178      * @param map a <code>java.util.Map</code> object that contains the mapping
3179      * from SQL type names to classes in the Java programming language
3180      * @return an <code>Object</code> in the Java programming language
3181      * representing the SQL value
3182      * @throws SQLException if (1) a database access error occurs
3183      *            or (2) this rowset does not currently have a valid connection,
3184      *            prepared statement, and result set
3185      */
3186     public Object getObject(int i, java.util.Map<String,Class<?>> map)
3187         throws SQLException
3188     {
3189         checkState();
3190 
3191         return rs.getObject(i, map);
3192     }
3193 
3194     /**
3195      * Returns the value of the designated column in the current row
3196      * of this rowset's <code>ResultSet</code> object as a <code>Ref</code> object.
3197      *
3198      * @param i the first column is 1, the second is 2, and so on
3199      * @return a <code>Ref</code> object representing an SQL <code>REF</code> value
3200      * @throws SQLException if (1) a database access error occurs
3201      *            or (2) this rowset does not currently have a valid connection,
3202      *            prepared statement, and result set
3203      */
3204     public Ref getRef(int i) throws SQLException {
3205         checkState();
3206 
3207         return rs.getRef(i);
3208     }
3209 
3210 
3211     /**
3212      * Returns the value of the designated column in the current row
3213      * of this rowset's <code>ResultSet</code> object as a <code>Blob</code> object.
3214      *
3215      * @param i the first column is 1, the second is 2, and so on
3216      * @return a <code>Blob</code> object representing the SQL <code>BLOB</code>
3217      *         value in the specified column
3218      * @throws SQLException if (1) a database access error occurs
3219      *            or (2) this rowset does not currently have a valid connection,
3220      *            prepared statement, and result set
3221      */
3222     public Blob getBlob(int i) throws SQLException {
3223         checkState();
3224 
3225         return rs.getBlob(i);
3226     }
3227 
3228     /**
3229      * Returns the value of the designated column in the current row
3230      * of this rowset's <code>ResultSet</code> object as a <code>Clob</code> object.
3231      *
3232      * @param i the first column is 1, the second is 2, and so on
3233      * @return a <code>Clob</code> object representing the SQL <code>CLOB</code>
3234      *         value in the specified column
3235      * @throws SQLException if (1) a database access error occurs
3236      *            or (2) this rowset does not currently have a valid connection,
3237      *            prepared statement, and result set
3238      */
3239     public Clob getClob(int i) throws SQLException {
3240         checkState();
3241 
3242         return rs.getClob(i);
3243     }
3244 
3245     /**
3246      * Returns the value of the designated column in the current row
3247      * of this rowset's <code>ResultSet</code> object as an <code>Array</code> object.
3248      *
3249      * @param i the first column is 1, the second is 2, and so on.
3250      * @return an <code>Array</code> object representing the SQL <code>ARRAY</code>
3251      *         value in the specified column
3252      * @throws SQLException if (1) a database access error occurs
3253      *            or (2) this rowset does not currently have a valid connection,
3254      *            prepared statement, and result set
3255      */
3256     public Array getArray(int i) throws SQLException {
3257         checkState();
3258 
3259         return rs.getArray(i);
3260     }
3261 
3262     /**
3263      * Returns the value of the designated column in the current row
3264      * of this rowset's <code>ResultSet</code> object as an <code>Object</code>.
3265      * This method uses the specified <code>Map</code> object for
3266      * custom mapping if appropriate.
3267      *
3268      * @param colName the name of the column from which to retrieve the value
3269      * @param map a <code>java.util.Map</code> object that contains the mapping
3270      * from SQL type names to classes in the Java programming language
3271      * @return an <code>Object</code> representing the SQL
3272      *         value in the specified column
3273      * @throws SQLException if (1) a database access error occurs
3274      *            or (2) this rowset does not currently have a valid connection,
3275      *            prepared statement, and result set
3276      */
3277     public Object getObject(String colName, java.util.Map<String,Class<?>> map)
3278         throws SQLException
3279     {
3280         return getObject(findColumn(colName), map);
3281     }
3282 
3283     /**
3284      * Returns the value of the designated column in the current row
3285      * of this rowset's <code>ResultSet</code> object as a <code>Ref</code> object.
3286      *
3287      * @param colName the column name
3288      * @return a <code>Ref</code> object representing the SQL <code>REF</code> value in
3289      *         the specified column
3290      * @throws SQLException if (1) a database access error occurs
3291      *            or (2) this rowset does not currently have a valid connection,
3292      *            prepared statement, and result set
3293      */
3294     public Ref getRef(String colName) throws SQLException {
3295         return getRef(findColumn(colName));
3296     }
3297 
3298     /**
3299      * Returns the value of the designated column in the current row
3300      * of this rowset's <code>ResultSet</code> object as a <code>Blob</code> object.
3301      *
3302      * @param colName the name of the column from which to retrieve the value
3303      * @return a <code>Blob</code> object representing the SQL <code>BLOB</code>
3304      *         value in the specified column
3305      * @throws SQLException if (1) a database access error occurs
3306      *            or (2) this rowset does not currently have a valid connection,
3307      *            prepared statement, and result set
3308      */
3309     public Blob getBlob(String colName) throws SQLException {
3310         return getBlob(findColumn(colName));
3311     }
3312 
3313     /**
3314      * Returns the value of the designated column in the current row
3315      * of this rowset's <code>ResultSet</code> object as a <code>Clob</code> object.
3316      *
3317      * @param colName the name of the column from which to retrieve the value
3318      * @return a <code>Clob</code> object representing the SQL <code>CLOB</code>
3319      *         value in the specified column
3320      * @throws SQLException if (1) a database access error occurs
3321      *            or (2) this rowset does not currently have a valid connection,
3322      *            prepared statement, and result set
3323      */
3324     public Clob getClob(String colName) throws SQLException {
3325         return getClob(findColumn(colName));
3326     }
3327 
3328     /**
3329      * Returns the value of the designated column in the current row
3330      * of this rowset's <code>ResultSet</code> object as an <code>Array</code> object.
3331      *
3332      * @param colName the name of the column from which to retrieve the value
3333      * @return an <code>Array</code> object representing the SQL <code>ARRAY</code>
3334      *         value in the specified column
3335      * @throws SQLException if (1) a database access error occurs
3336      *            or (2) this rowset does not currently have a valid connection,
3337      *            prepared statement, and result set
3338      */
3339     public Array getArray(String colName) throws SQLException {
3340         return getArray(findColumn(colName));
3341     }
3342 
3343     /**
3344      * Returns the value of the designated column in the current row
3345      * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Date</code>
3346      * object. This method uses the given calendar to construct an appropriate
3347      * millisecond value for the date if the underlying database does not store
3348      * timezone information.
3349      *
3350      * @param columnIndex the first column is 1, the second is 2, and so on
3351      * @param cal the <code>java.util.Calendar</code> object
3352      *        to use in constructing the date
3353      * @return the column value as a <code>java.sql.Date</code> object;
3354      *         if the value is SQL <code>NULL</code>,
3355      *         the value returned is <code>null</code>
3356      * @throws SQLException if (1) a database access error occurs
3357      *            or (2) this rowset does not currently have a valid connection,
3358      *            prepared statement, and result set
3359      */
3360     public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException {
3361         checkState();
3362 
3363         return rs.getDate(columnIndex, cal);
3364     }
3365 
3366     /**
3367      * Returns the value of the designated column in the current row
3368      * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Date</code>
3369      * object. This method uses the given calendar to construct an appropriate
3370      * millisecond value for the date if the underlying database does not store
3371      * timezone information.
3372      *
3373      * @param columnName the SQL name of the column from which to retrieve the value
3374      * @param cal the <code>java.util.Calendar</code> object
3375      *        to use in constructing the date
3376      * @return the column value as a <code>java.sql.Date</code> object;
3377      *         if the value is SQL <code>NULL</code>,
3378      *         the value returned is <code>null</code>
3379      * @throws SQLException if a database access error occurs
3380      *            or this rowset does not currently have a valid connection,
3381      *            prepared statement, and result set
3382      *
3383      */
3384     public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException {
3385         return getDate(findColumn(columnName), cal);
3386     }
3387 
3388     /**
3389      * Returns the value of the designated column in the current row
3390      * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Time</code>
3391      * object. This method uses the given calendar to construct an appropriate
3392      * millisecond value for the date if the underlying database does not store
3393      * timezone information.
3394      *
3395      * @param columnIndex the first column is 1, the second is 2, and so on
3396      * @param cal the <code>java.util.Calendar</code> object
3397      *        to use in constructing the time
3398      * @return the column value as a <code>java.sql.Time</code> object;
3399      *         if the value is SQL <code>NULL</code>,
3400      *         the value returned is <code>null</code> in the Java programming language
3401      * @throws SQLException if a database access error occurs
3402      *            or this rowset does not currently have a valid connection,
3403      *            prepared statement, and result set
3404      */
3405     public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException {
3406         checkState();
3407 
3408         return rs.getTime(columnIndex, cal);
3409     }
3410 
3411     /**
3412      * Returns the value of the designated column in the current row
3413      * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Time</code>
3414      * object. This method uses the given calendar to construct an appropriate
3415      * millisecond value for the date if the underlying database does not store
3416      * timezone information.
3417      *
3418      * @param columnName the SQL name of the column
3419      * @param cal the <code>java.util.Calendar</code> object
3420      *        to use in constructing the time
3421      * @return the column value as a <code>java.sql.Time</code> object;
3422      *         if the value is SQL <code>NULL</code>,
3423      *         the value returned is <code>null</code> in the Java programming language
3424      * @throws SQLException if a database access error occurs
3425      *            or this rowset does not currently have a valid connection,
3426      *            prepared statement, and result set
3427      */
3428     public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException {
3429         return getTime(findColumn(columnName), cal);
3430     }
3431 
3432     /**
3433      * Returns the value of the designated column in the current row
3434      * of this rowset's <code>ResultSet</code> object as a
3435      * <code>java.sql.Timestamp</code> object.
3436      * This method uses the given calendar to construct an appropriate millisecond
3437      * value for the timestamp if the underlying database does not store
3438      * timezone information.
3439      *
3440      * @param columnIndex the first column is 1, the second is 2, and so on
3441      * @param cal the <code>java.util.Calendar</code> object
3442      *        to use in constructing the timestamp
3443      * @return the column value as a <code>java.sql.Timestamp</code> object;
3444      *         if the value is SQL <code>NULL</code>,
3445      *         the value returned is <code>null</code>
3446      * @throws SQLException if a database access error occurs
3447      *            or this rowset does not currently have a valid connection,
3448      *            prepared statement, and result set
3449      */
3450     public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
3451         checkState();
3452 
3453         return rs.getTimestamp(columnIndex, cal);
3454     }
3455 
3456     /**
3457      * Returns the value of the designated column in the current row
3458      * of this rowset's <code>ResultSet</code> object as a
3459      * <code>java.sql.Timestamp</code> object.
3460      * This method uses the given calendar to construct an appropriate millisecond
3461      * value for the timestamp if the underlying database does not store
3462      * timezone information.
3463      *
3464      * @param columnName the SQL name of the column
3465      * @param cal the <code>java.util.Calendar</code> object
3466      *        to use in constructing the timestamp
3467      * @return the column value as a <code>java.sql.Timestamp</code> object;
3468      *         if the value is SQL <code>NULL</code>,
3469      *         the value returned is <code>null</code>
3470      * @throws SQLException if a database access error occurs
3471      *            or this rowset does not currently have a valid connection,
3472      *            prepared statement, and result set
3473      */
3474     public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException {
3475         return getTimestamp(findColumn(columnName), cal);
3476     }
3477 
3478 
3479     /**
3480      * Sets the designated column in either the current row or the insert
3481      * row of this <code>JdbcRowSetImpl</code> object with the given
3482      * <code>double</code> value.
3483      *
3484      * This method updates a column value in either the current row or
3485      * the insert row of this rowset, but it does not update the
3486      * database.  If the cursor is on a row in the rowset, the
3487      * method {@link #updateRow} must be called to update the database.
3488      * If the cursor is on the insert row, the method {@link #insertRow}
3489      * must be called, which will insert the new row into both this rowset
3490      * and the database. Both of these methods must be called before the
3491      * cursor moves to another row.
3492      *
3493      * @param columnIndex the first column is <code>1</code>, the second
3494      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3495      *        and equal to or less than the number of columns in this rowset
3496      * @param ref the new <code>Ref</code> column value
3497      * @throws SQLException if (1) the given column index is out of bounds,
3498      *            (2) the cursor is not on one of this rowset's rows or its
3499      *            insert row, or (3) this rowset is
3500      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3501      */
3502     public void updateRef(int columnIndex, java.sql.Ref ref)
3503         throws SQLException {
3504         checkState();
3505         rs.updateRef(columnIndex, ref);
3506     }
3507 
3508     /**
3509      * Sets the designated column in either the current row or the insert
3510      * row of this <code>JdbcRowSetImpl</code> object with the given
3511      * <code>double</code> value.
3512      *
3513      * This method updates a column value in either the current row or
3514      * the insert row of this rowset, but it does not update the
3515      * database.  If the cursor is on a row in the rowset, the
3516      * method {@link #updateRow} must be called to update the database.
3517      * If the cursor is on the insert row, the method {@link #insertRow}
3518      * must be called, which will insert the new row into both this rowset
3519      * and the database. Both of these methods must be called before the
3520      * cursor moves to another row.
3521      *
3522      * @param columnName a <code>String</code> object that must match the
3523      *        SQL name of a column in this rowset, ignoring case
3524      * @param ref the new column value
3525      * @throws SQLException if (1) the given column name does not match the
3526      *            name of a column in this rowset, (2) the cursor is not on
3527      *            one of this rowset's rows or its insert row, or (3) this
3528      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3529      */
3530     public void updateRef(String columnName, java.sql.Ref ref)
3531         throws SQLException {
3532         updateRef(findColumn(columnName), ref);
3533     }
3534 
3535     /**
3536      * Sets the designated column in either the current row or the insert
3537      * row of this <code>JdbcRowSetImpl</code> object with the given
3538      * <code>double</code> value.
3539      *
3540      * This method updates a column value in either the current row or
3541      * the insert row of this rowset, but it does not update the
3542      * database.  If the cursor is on a row in the rowset, the
3543      * method {@link #updateRow} must be called to update the database.
3544      * If the cursor is on the insert row, the method {@link #insertRow}
3545      * must be called, which will insert the new row into both this rowset
3546      * and the database. Both of these methods must be called before the
3547      * cursor moves to another row.
3548      *
3549      * @param columnIndex the first column is <code>1</code>, the second
3550      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3551      *        and equal to or less than the number of columns in this rowset
3552      * @param c the new column <code>Clob</code> value
3553      * @throws SQLException if (1) the given column index is out of bounds,
3554      *            (2) the cursor is not on one of this rowset's rows or its
3555      *            insert row, or (3) this rowset is
3556      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3557      */
3558     public void updateClob(int columnIndex, Clob c) throws SQLException {
3559         checkState();
3560         rs.updateClob(columnIndex, c);
3561     }
3562 
3563 
3564     /**
3565      * Sets the designated column in either the current row or the insert
3566      * row of this <code>JdbcRowSetImpl</code> object with the given
3567      * <code>double</code> value.
3568      *
3569      * This method updates a column value in either the current row or
3570      * the insert row of this rowset, but it does not update the
3571      * database.  If the cursor is on a row in the rowset, the
3572      * method {@link #updateRow} must be called to update the database.
3573      * If the cursor is on the insert row, the method {@link #insertRow}
3574      * must be called, which will insert the new row into both this rowset
3575      * and the database. Both of these methods must be called before the
3576      * cursor moves to another row.
3577      *
3578      * @param columnName a <code>String</code> object that must match the
3579      *        SQL name of a column in this rowset, ignoring case
3580      * @param c the new column <code>Clob</code> value
3581      * @throws SQLException if (1) the given column name does not match the
3582      *            name of a column in this rowset, (2) the cursor is not on
3583      *            one of this rowset's rows or its insert row, or (3) this
3584      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3585      */
3586     public void updateClob(String columnName, Clob c) throws SQLException {
3587         updateClob(findColumn(columnName), c);
3588     }
3589 
3590     /**
3591      * Sets the designated column in either the current row or the insert
3592      * row of this <code>JdbcRowSetImpl</code> object with the given
3593      * <code>java.sql.Blob</code> value.
3594      *
3595      * This method updates a column value in either the current row or
3596      * the insert row of this rowset, but it does not update the
3597      * database.  If the cursor is on a row in the rowset, the
3598      * method {@link #updateRow} must be called to update the database.
3599      * If the cursor is on the insert row, the method {@link #insertRow}
3600      * must be called, which will insert the new row into both this rowset
3601      * and the database. Both of these methods must be called before the
3602      * cursor moves to another row.
3603      *
3604      * @param columnIndex the first column is <code>1</code>, the second
3605      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3606      *        and equal to or less than the number of columns in this rowset
3607      * @param b the new column <code>Blob</code> value
3608      * @throws SQLException if (1) the given column index is out of bounds,
3609      *            (2) the cursor is not on one of this rowset's rows or its
3610      *            insert row, or (3) this rowset is
3611      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3612      */
3613     public void updateBlob(int columnIndex, Blob b) throws SQLException {
3614         checkState();
3615         rs.updateBlob(columnIndex, b);
3616     }
3617 
3618     /**
3619      * Sets the designated column in either the current row or the insert
3620      * row of this <code>JdbcRowSetImpl</code> object with the given
3621      * <code>java.sql.Blob </code> value.
3622      *
3623      * This method updates a column value in either the current row or
3624      * the insert row of this rowset, but it does not update the
3625      * database.  If the cursor is on a row in the rowset, the
3626      * method {@link #updateRow} must be called to update the database.
3627      * If the cursor is on the insert row, the method {@link #insertRow}
3628      * must be called, which will insert the new row into both this rowset
3629      * and the database. Both of these methods must be called before the
3630      * cursor moves to another row.
3631      *
3632      * @param columnName a <code>String</code> object that must match the
3633      *        SQL name of a column in this rowset, ignoring case
3634      * @param b the new column <code>Blob</code> value
3635      * @throws SQLException if (1) the given column name does not match the
3636      *            name of a column in this rowset, (2) the cursor is not on
3637      *            one of this rowset's rows or its insert row, or (3) this
3638      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3639      */
3640     public void updateBlob(String columnName, Blob b) throws SQLException {
3641         updateBlob(findColumn(columnName), b);
3642     }
3643 
3644     /**
3645      * Sets the designated column in either the current row or the insert
3646      * row of this <code>JdbcRowSetImpl</code> object with the given
3647      * <code>java.sql.Array</code> values.
3648      *
3649      * This method updates a column value in either the current row or
3650      * the insert row of this rowset, but it does not update the
3651      * database.  If the cursor is on a row in the rowset, the
3652      * method {@link #updateRow} must be called to update the database.
3653      * If the cursor is on the insert row, the method {@link #insertRow}
3654      * must be called, which will insert the new row into both this rowset
3655      * and the database. Both of these methods must be called before the
3656      * cursor moves to another row.
3657      *
3658      * @param columnIndex the first column is <code>1</code>, the second
3659      *        is <code>2</code>, and so on; must be <code>1</code> or larger
3660      *        and equal to or less than the number of columns in this rowset
3661      * @param a the new column <code>Array</code> value
3662      * @throws SQLException if (1) the given column index is out of bounds,
3663      *            (2) the cursor is not on one of this rowset's rows or its
3664      *            insert row, or (3) this rowset is
3665      *            <code>ResultSet.CONCUR_READ_ONLY</code>
3666      */
3667     public void updateArray(int columnIndex, Array a) throws SQLException {
3668         checkState();
3669         rs.updateArray(columnIndex, a);
3670     }
3671 
3672     /**
3673      * Sets the designated column in either the current row or the insert
3674      * row of this <code>JdbcRowSetImpl</code> object with the given
3675      * <code>java.sql.Array</code> value.
3676      *
3677      * This method updates a column value in either the current row or
3678      * the insert row of this rowset, but it does not update the
3679      * database.  If the cursor is on a row in the rowset, the
3680      * method {@link #updateRow} must be called to update the database.
3681      * If the cursor is on the insert row, the method {@link #insertRow}
3682      * must be called, which will insert the new row into both this rowset
3683      * and the database. Both of these methods must be called before the
3684      * cursor moves to another row.
3685      *
3686      * @param columnName a <code>String</code> object that must match the
3687      *        SQL name of a column in this rowset, ignoring case
3688      * @param a the new column <code>Array</code> value
3689      * @throws SQLException if (1) the given column name does not match the
3690      *            name of a column in this rowset, (2) the cursor is not on
3691      *            one of this rowset's rows or its insert row, or (3) this
3692      *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
3693      */
3694     public void updateArray(String columnName, Array a) throws SQLException {
3695         updateArray(findColumn(columnName), a);
3696     }
3697 
3698     /**
3699      * Provide interface coverage for getURL(int) in ResultSet->RowSet
3700      */
3701     public java.net.URL getURL(int columnIndex) throws SQLException {
3702         checkState();
3703         return rs.getURL(columnIndex);
3704     }
3705 
3706     /**
3707      * Provide interface coverage for getURL(String) in ResultSet->RowSet
3708      */
3709     public java.net.URL getURL(String columnName) throws SQLException {
3710         return getURL(findColumn(columnName));
3711     }
3712 
3713     /**
3714      * Return the RowSetWarning object for the current row of a
3715      * <code>JdbcRowSetImpl</code>
3716      */
3717     public RowSetWarning getRowSetWarnings() throws SQLException {
3718        return null;
3719     }
3720     /**
3721      * Unsets the designated parameter to the given int array.
3722      * This was set using <code>setMatchColumn</code>
3723      * as the column which will form the basis of the join.
3724      * <P>
3725      * The parameter value unset by this method should be same
3726      * as was set.
3727      *
3728      * @param columnIdxes the index into this rowset
3729      *        object's internal representation of parameter values
3730      * @throws SQLException if an error occurs or the
3731      *  parameter index is out of bounds or if the columnIdx is
3732      *  not the same as set using <code>setMatchColumn(int [])</code>
3733      */
3734     public void unsetMatchColumn(int[] columnIdxes) throws SQLException {
3735 
3736          int i_val;
3737          for( int j= 0 ;j < columnIdxes.length; j++) {
3738             i_val = (Integer.parseInt(iMatchColumns.get(j).toString()));
3739             if(columnIdxes[j] != i_val) {
3740                throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols").toString());
3741             }
3742          }
3743 
3744          for( int i = 0;i < columnIdxes.length ;i++) {
3745             iMatchColumns.set(i,Integer.valueOf(-1));
3746          }
3747     }
3748 
3749    /**
3750      * Unsets the designated parameter to the given String array.
3751      * This was set using <code>setMatchColumn</code>
3752      * as the column which will form the basis of the join.
3753      * <P>
3754      * The parameter value unset by this method should be same
3755      * as was set.
3756      *
3757      * @param columnIdxes the index into this rowset
3758      *        object's internal representation of parameter values
3759      * @throws SQLException if an error occurs or the
3760      *  parameter index is out of bounds or if the columnName is
3761      *  not the same as set using <code>setMatchColumn(String [])</code>
3762      */
3763     public void unsetMatchColumn(String[] columnIdxes) throws SQLException {
3764 
3765         for(int j = 0 ;j < columnIdxes.length; j++) {
3766            if( !columnIdxes[j].equals(strMatchColumns.get(j)) ){
3767               throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols").toString());
3768            }
3769         }
3770 
3771         for(int i = 0 ; i < columnIdxes.length; i++) {
3772            strMatchColumns.set(i,null);
3773         }
3774     }
3775 
3776     /**
3777      * Retrieves the column name as <code>String</code> array
3778      * that was set using <code>setMatchColumn(String [])</code>
3779      * for this rowset.
3780      *
3781      * @return a <code>String</code> array object that contains the column names
3782      *         for the rowset which has this the match columns
3783      *
3784      * @throws SQLException if an error occurs or column name is not set
3785      */
3786     public String[] getMatchColumnNames() throws SQLException {
3787 
3788         String []str_temp = new String[strMatchColumns.size()];
3789 
3790         if( strMatchColumns.get(0) == null) {
3791            throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.setmatchcols").toString());
3792         }
3793 
3794         strMatchColumns.copyInto(str_temp);
3795         return str_temp;
3796     }
3797 
3798     /**
3799      * Retrieves the column id as <code>int</code> array that was set using
3800      * <code>setMatchColumn(int [])</code> for this rowset.
3801      *
3802      * @return a <code>int</code> array object that contains the column ids
3803      *         for the rowset which has this as the match columns.
3804      *
3805      * @throws SQLException if an error occurs or column index is not set
3806      */
3807     public int[] getMatchColumnIndexes() throws SQLException {
3808 
3809         Integer []int_temp = new Integer[iMatchColumns.size()];
3810         int [] i_temp = new int[iMatchColumns.size()];
3811         int i_val;
3812 
3813         i_val = iMatchColumns.get(0);
3814 
3815         if( i_val == -1 ) {
3816            throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.setmatchcols").toString());
3817         }
3818 
3819 
3820         iMatchColumns.copyInto(int_temp);
3821 
3822         for(int i = 0; i < int_temp.length; i++) {
3823            i_temp[i] = (int_temp[i]).intValue();
3824         }
3825 
3826         return i_temp;
3827     }
3828 
3829     /**
3830      * Sets the designated parameter to the given int array.
3831      * This forms the basis of the join for the
3832      * <code>JoinRowSet</code> as the column which will form the basis of the
3833      * join.
3834      * <P>
3835      * The parameter value set by this method is stored internally and
3836      * will be supplied as the appropriate parameter in this rowset's
3837      * command when the method <code>getMatchColumnIndexes</code> is called.
3838      *
3839      * @param columnIdxes the indexes into this rowset
3840      *        object's internal representation of parameter values; the
3841      *        first parameter is 0, the second is 1, and so on; must be
3842      *        <code>0</code> or greater
3843      * @throws SQLException if an error occurs or the
3844      *                         parameter index is out of bounds
3845      */
3846     public void setMatchColumn(int[] columnIdxes) throws SQLException {
3847 
3848         for(int j = 0 ; j < columnIdxes.length; j++) {
3849            if( columnIdxes[j] < 0 ) {
3850               throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols1").toString());
3851            }
3852         }
3853         for(int i = 0 ;i < columnIdxes.length; i++) {
3854            iMatchColumns.add(i,Integer.valueOf(columnIdxes[i]));
3855         }
3856     }
3857 
3858     /**
3859      * Sets the designated parameter to the given String array.
3860      *  This forms the basis of the join for the
3861      * <code>JoinRowSet</code> as the column which will form the basis of the
3862      * join.
3863      * <P>
3864      * The parameter value set by this method is stored internally and
3865      * will be supplied as the appropriate parameter in this rowset's
3866      * command when the method <code>getMatchColumn</code> is called.
3867      *
3868      * @param columnNames the name of the column into this rowset
3869      *        object's internal representation of parameter values
3870      * @throws SQLException if an error occurs or the
3871      *  parameter index is out of bounds
3872      */
3873     public void setMatchColumn(String[] columnNames) throws SQLException {
3874 
3875         for(int j = 0; j < columnNames.length; j++) {
3876            if( columnNames[j] == null || columnNames[j].equals("")) {
3877               throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols2").toString());
3878            }
3879         }
3880         for( int i = 0; i < columnNames.length; i++) {
3881            strMatchColumns.add(i,columnNames[i]);
3882         }
3883     }
3884 
3885 
3886         /**
3887      * Sets the designated parameter to the given <code>int</code>
3888      * object.  This forms the basis of the join for the
3889      * <code>JoinRowSet</code> as the column which will form the basis of the
3890      * join.
3891      * <P>
3892      * The parameter value set by this method is stored internally and
3893      * will be supplied as the appropriate parameter in this rowset's
3894      * command when the method <code>getMatchColumn</code> is called.
3895      *
3896      * @param columnIdx the index into this rowset
3897      *        object's internal representation of parameter values; the
3898      *        first parameter is 0, the second is 1, and so on; must be
3899      *        <code>0</code> or greater
3900      * @throws SQLException if an error occurs or the
3901      *                         parameter index is out of bounds
3902      */
3903     public void setMatchColumn(int columnIdx) throws SQLException {
3904         // validate, if col is ok to be set
3905         if(columnIdx < 0) {
3906             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols1").toString());
3907         } else {
3908             // set iMatchColumn
3909             iMatchColumns.set(0, Integer.valueOf(columnIdx));
3910             //strMatchColumn = null;
3911         }
3912     }
3913 
3914     /**
3915      * Sets the designated parameter to the given <code>String</code>
3916      * object.  This forms the basis of the join for the
3917      * <code>JoinRowSet</code> as the column which will form the basis of the
3918      * join.
3919      * <P>
3920      * The parameter value set by this method is stored internally and
3921      * will be supplied as the appropriate parameter in this rowset's
3922      * command when the method <code>getMatchColumn</code> is called.
3923      *
3924      * @param columnName the name of the column into this rowset
3925      *        object's internal representation of parameter values
3926      * @throws SQLException if an error occurs or the
3927      *  parameter index is out of bounds
3928      */
3929     public void setMatchColumn(String columnName) throws SQLException {
3930         // validate, if col is ok to be set
3931         if(columnName == null || (columnName= columnName.trim()).equals("")) {
3932             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols2").toString());
3933         } else {
3934             // set strMatchColumn
3935             strMatchColumns.set(0, columnName);
3936             //iMatchColumn = -1;
3937         }
3938     }
3939 
3940     /**
3941      * Unsets the designated parameter to the given <code>int</code>
3942      * object.  This was set using <code>setMatchColumn</code>
3943      * as the column which will form the basis of the join.
3944      * <P>
3945      * The parameter value unset by this method should be same
3946      * as was set.
3947      *
3948      * @param columnIdx the index into this rowset
3949      *        object's internal representation of parameter values
3950      * @throws SQLException if an error occurs or the
3951      *  parameter index is out of bounds or if the columnIdx is
3952      *  not the same as set using <code>setMatchColumn(int)</code>
3953      */
3954     public void unsetMatchColumn(int columnIdx) throws SQLException {
3955         // check if we are unsetting the SAME column
3956         if(! iMatchColumns.get(0).equals(Integer.valueOf(columnIdx) )  ) {
3957             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.unsetmatch").toString());
3958         } else if(strMatchColumns.get(0) != null) {
3959             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.usecolname").toString());
3960         } else {
3961                 // that is, we are unsetting it.
3962                iMatchColumns.set(0, Integer.valueOf(-1));
3963         }
3964     }
3965 
3966     /**
3967      * Unsets the designated parameter to the given <code>String</code>
3968      * object.  This was set using <code>setMatchColumn</code>
3969      * as the column which will form the basis of the join.
3970      * <P>
3971      * The parameter value unset by this method should be same
3972      * as was set.
3973      *
3974      * @param columnName the index into this rowset
3975      *        object's internal representation of parameter values
3976      * @throws SQLException if an error occurs or the
3977      *  parameter index is out of bounds or if the columnName is
3978      *  not the same as set using <code>setMatchColumn(String)</code>
3979      *
3980      */
3981     public void unsetMatchColumn(String columnName) throws SQLException {
3982         // check if we are unsetting the same column
3983         columnName = columnName.trim();
3984 
3985         if(!((strMatchColumns.get(0)).equals(columnName))) {
3986             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.unsetmatch").toString());
3987         } else if(iMatchColumns.get(0) > 0) {
3988             throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.usecolid").toString());
3989         } else {
3990             strMatchColumns.set(0, null);   // that is, we are unsetting it.
3991         }
3992     }
3993 
3994     /**
3995      * Retrieves the <code>DatabaseMetaData</code> associated with
3996      * the connection handle associated this this
3997      * <code>JdbcRowSet</code> object.
3998      *
3999      * @return the <code>DatabaseMetadata</code> associated
4000      *  with the rowset's connection.
4001      * @throws SQLException if a database access error occurs
4002      */
4003     public DatabaseMetaData getDatabaseMetaData() throws SQLException {
4004         Connection con = connect();
4005         return con.getMetaData();
4006     }
4007 
4008     /**
4009      * Retrieves the <code>ParameterMetaData</code> associated with
4010      * the connection handle associated this this
4011      * <code>JdbcRowSet</code> object.
4012      *
4013      * @return the <code>ParameterMetadata</code> associated
4014      *  with the rowset's connection.
4015      * @throws SQLException if a database access error occurs
4016      */
4017     public ParameterMetaData getParameterMetaData() throws SQLException {
4018         prepare();
4019         return (ps.getParameterMetaData());
4020     }
4021 
4022     /**
4023      * Commits all updates in this <code>JdbcRowSet</code> object by
4024      * wrapping the internal <code>Connection</code> object and calling
4025      * its <code>commit</code> method.
4026      * This method sets this <code>JdbcRowSet</code> object's private field
4027      * <code>rs</code> to <code>null</code> after saving its value to another
4028      * object, but only if the <code>ResultSet</code>
4029      * constant <code>HOLD_CURSORS_OVER_COMMIT</code> has not been set.
4030      * (The field <code>rs</code> is this <code>JdbcRowSet</code> object's
4031      * <code>ResultSet</code> object.)
4032      *
4033      * @throws SQLException if autoCommit is set to true or if a database
4034      * access error occurs
4035      */
4036     public void commit() throws SQLException {
4037       conn.commit();
4038 
4039       // Checking the holadbility value and making the result set handle null
4040       // Added as per Rave requirements
4041 
4042       if( conn.getHoldability() != HOLD_CURSORS_OVER_COMMIT) {
4043          rs = null;
4044       }
4045     }
4046 
4047     /**
4048      * Sets auto-commit on the internal <code>Connection</code> object with this
4049      * <code>JdbcRowSet</code>
4050      *
4051      * @throws SQLException if a database access error occurs
4052      */
4053     public void setAutoCommit(boolean autoCommit) throws SQLException {
4054         // The connection object should be there
4055         // in order to commit the connection handle on or off.
4056 
4057         if(conn != null) {
4058            conn.setAutoCommit(autoCommit);
4059         } else {
4060            // Coming here means the connection object is null.
4061            // So generate a connection handle internally, since
4062            // a JdbcRowSet is always connected to a db, it is fine
4063            // to get a handle to the connection.
4064 
4065            // Get hold of a connection handle
4066            // and change the autcommit as passesd.
4067            conn = connect();
4068 
4069            // After setting the below the conn.getAutoCommit()
4070            // should return the same value.
4071            conn.setAutoCommit(autoCommit);
4072 
4073         }
4074     }
4075 
4076     /**
4077      * Returns the auto-commit status with this <code>JdbcRowSet</code>.
4078      *
4079      * @return true if auto commit is true; false otherwise
4080      * @throws SQLException if a database access error occurs
4081      */
4082     public boolean getAutoCommit() throws SQLException {
4083         return conn.getAutoCommit();
4084     }
4085 
4086     /**
4087      * Rolls back all the updates in this <code>JdbcRowSet</code> object by
4088      * wrapping the internal <code>Connection</code> object and calling its
4089      * <code>rollback</code> method.
4090      * This method sets this <code>JdbcRowSet</code> object's private field
4091      * <code>rs</code> to <code>null</code> after saving its value to another object.
4092      * (The field <code>rs</code> is this <code>JdbcRowSet</code> object's
4093      * internal <code>ResultSet</code> object.)
4094      *
4095      * @throws SQLException if autoCommit is set to true or a database
4096      * access error occurs
4097      */
4098     public void rollback() throws SQLException {
4099         conn.rollback();
4100 
4101         // Makes the result ste handle null after rollback
4102         // Added as per Rave requirements
4103 
4104         rs = null;
4105     }
4106 
4107 
4108     /**
4109      * Rollbacks all the updates in the <code>JdbcRowSet</code> back to the
4110      * last <code>Savepoint</code> transaction marker. Wraps the internal
4111      * <code>Connection</code> object and call it's rollback method
4112      *
4113      * @param s the <code>Savepoint</code> transaction marker to roll the
4114      * transaction to.
4115      * @throws SQLException if autoCommit is set to true; or ia a database
4116      * access error occurs
4117      */
4118     public void rollback(Savepoint s) throws SQLException {
4119         conn.rollback(s);
4120     }
4121 
4122     // Setting the ResultSet Type and Concurrency
4123     protected void setParams() throws SQLException {
4124         if(rs == null) {
4125            setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
4126            setConcurrency(ResultSet.CONCUR_UPDATABLE);
4127         }
4128         else {
4129             setType(rs.getType());
4130             setConcurrency(rs.getConcurrency());
4131         }
4132     }
4133 
4134 
4135     // Checking ResultSet Type and Concurrency
4136     private void checkTypeConcurrency() throws SQLException {
4137         if(rs.getType() == TYPE_FORWARD_ONLY ||
4138            rs.getConcurrency() == CONCUR_READ_ONLY) {
4139               throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.resnotupd").toString());
4140          }
4141     }
4142 
4143      // Returns a Connection Handle
4144     //  Added as per Rave requirements
4145 
4146     /**
4147      * Gets this <code>JdbcRowSet</code> object's Connection property
4148      *
4149      *
4150      * @return the <code>Connection</code> object associated with this rowset;
4151      */
4152 
4153     protected Connection getConnection() {
4154        return conn;
4155     }
4156 
4157     // Sets the connection handle with the parameter
4158     // Added as per rave requirements
4159 
4160     /**
4161      * Sets this <code>JdbcRowSet</code> object's connection property
4162      * to the given <code>Connection</code> object.
4163      *
4164      * @param connection the <code>Connection</code> object.
4165      */
4166 
4167     protected void setConnection(Connection connection) {
4168        conn = connection;
4169     }
4170 
4171     // Returns a PreparedStatement Handle
4172     // Added as per Rave requirements
4173 
4174     /**
4175      * Gets this <code>JdbcRowSet</code> object's PreparedStatement property
4176      *
4177      *
4178      * @return the <code>PreparedStatement</code> object associated with this rowset;
4179      */
4180 
4181     protected PreparedStatement getPreparedStatement() {
4182        return ps;
4183     }
4184 
4185     //Sets the prepared statement handle to the parameter
4186     // Added as per Rave requirements
4187 
4188     /**
4189      * Sets this <code>JdbcRowSet</code> object's preparedtsatement property
4190      * to the given <code>PreparedStatemennt</code> object.
4191      *
4192      * @param preparedStatement the <code>PreparedStatement</code> object
4193      *
4194      */
4195     protected void setPreparedStatement(PreparedStatement preparedStatement) {
4196        ps = preparedStatement;
4197     }
4198 
4199     // Returns a ResultSet handle
4200     // Added as per Rave requirements
4201 
4202     /**
4203      * Gets this <code>JdbcRowSet</code> object's ResultSet property
4204      *
4205      *
4206      * @return the <code>ResultSet</code> object associated with this rowset;
4207      */
4208 
4209     protected ResultSet getResultSet() throws SQLException {
4210 
4211        checkState();
4212 
4213        return rs;
4214     }
4215 
4216     // Sets the result set handle to the parameter
4217     // Added as per Rave requirements
4218 
4219     /**
4220      * Sets this <code>JdbcRowSet</code> object's resultset property
4221      * to the given <code>ResultSet</code> object.
4222      *
4223      * @param resultSet the <code>ResultSet</code> object
4224      *
4225      */
4226     protected void setResultSet(ResultSet resultSet) {
4227        rs = resultSet;
4228     }
4229 
4230     /**
4231      * Sets this <code>JdbcRowSet</code> object's <code>command</code> property to
4232      * the given <code>String</code> object and clears the parameters, if any,
4233      * that were set for the previous command. In addition,
4234      * if the <code>command</code> property has previously been set to a
4235      * non-null value and it is
4236      * different from the <code>String</code> object supplied,
4237      * this method sets this <code>JdbcRowSet</code> object's private fields
4238      * <code>ps</code> and <code>rs</code> to <code>null</code>.
4239      * (The field <code>ps</code> is its <code>PreparedStatement</code> object, and
4240      * the field <code>rs</code> is its <code>ResultSet</code> object.)
4241      * <P>
4242      * The <code>command</code> property may not be needed if the <code>RowSet</code>
4243      * object gets its data from a source that does not support commands,
4244      * such as a spreadsheet or other tabular file.
4245      * Thus, this property is optional and may be <code>null</code>.
4246      *
4247      * @param command a <code>String</code> object containing an SQL query
4248      *            that will be set as this <code>RowSet</code> object's command
4249      *            property; may be <code>null</code> but may not be an empty string
4250      * @throws SQLException if an empty string is provided as the command value
4251      * @see #getCommand
4252      */
4253     public void setCommand(String command) throws SQLException {
4254 
4255        if (getCommand() != null) {
4256           if(!getCommand().equals(command)) {
4257              super.setCommand(command);
4258              ps = null;
4259              rs = null;
4260           }
4261        }
4262        else {
4263           super.setCommand(command);
4264        }
4265     }
4266 
4267     /**
4268      * Sets the <code>dataSourceName</code> property for this <code>JdbcRowSet</code>
4269      * object to the given logical name and sets this <code>JdbcRowSet</code> object's
4270      * Url property to <code>null</code>. In addition, if the <code>dataSourceName</code>
4271      * property has previously been set and is different from the one supplied,
4272      * this method sets this <code>JdbcRowSet</code> object's private fields
4273      * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
4274      * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
4275      * the field <code>rs</code> is its <code>ResultSet</code> object, and
4276      * the field <code>conn</code> is its <code>Connection</code> object.)
4277      * <P>
4278      * The name supplied to this method must have been bound to a
4279      * <code>DataSource</code> object in a JNDI naming service so that an
4280      * application can do a lookup using that name to retrieve the
4281      * <code>DataSource</code> object bound to it. The <code>DataSource</code>
4282      * object can then be used to establish a connection to the data source it
4283      * represents.
4284      * <P>
4285      * Users should set either the Url property or the dataSourceName property.
4286      * If both properties are set, the driver will use the property set most recently.
4287      *
4288      * @param dsName a <code>String</code> object with the name that can be supplied
4289      *        to a naming service based on JNDI technology to retrieve the
4290      *        <code>DataSource</code> object that can be used to get a connection;
4291      *        may be <code>null</code>
4292      * @throws SQLException if there is a problem setting the
4293      *          <code>dataSourceName</code> property
4294      * @see #getDataSourceName
4295      */
4296     public void setDataSourceName(String dsName) throws SQLException{
4297 
4298        if(getDataSourceName() != null) {
4299           if(!getDataSourceName().equals(dsName)) {
4300              super.setDataSourceName(dsName);
4301              conn = null;
4302              ps = null;
4303              rs = null;
4304           }
4305        }
4306        else {
4307           super.setDataSourceName(dsName);
4308        }
4309     }
4310 
4311 
4312     /**
4313      * Sets the Url property for this <code>JdbcRowSet</code> object
4314      * to the given <code>String</code> object and sets the dataSource name
4315      * property to <code>null</code>. In addition, if the Url property has
4316      * previously been set to a non <code>null</code> value and its value
4317      * is different from the value to be set,
4318      * this method sets this <code>JdbcRowSet</code> object's private fields
4319      * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
4320      * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
4321      * the field <code>rs</code> is its <code>ResultSet</code> object, and
4322      * the field <code>conn</code> is its <code>Connection</code> object.)
4323      * <P>
4324      * The Url property is a JDBC URL that is used when
4325      * the connection is created using a JDBC technology-enabled driver
4326      * ("JDBC driver") and the <code>DriverManager</code>.
4327      * The correct JDBC URL for the specific driver to be used can be found
4328      * in the driver documentation.  Although there are guidelines for for how
4329      * a JDBC URL is formed,
4330      * a driver vendor can specify any <code>String</code> object except
4331      * one with a length of <code>0</code> (an empty string).
4332      * <P>
4333      * Setting the Url property is optional if connections are established using
4334      * a <code>DataSource</code> object instead of the <code>DriverManager</code>.
4335      * The driver will use either the URL property or the
4336      * dataSourceName property to create a connection, whichever was
4337      * specified most recently. If an application uses a JDBC URL, it
4338      * must load a JDBC driver that accepts the JDBC URL before it uses the
4339      * <code>RowSet</code> object to connect to a database.  The <code>RowSet</code>
4340      * object will use the URL internally to create a database connection in order
4341      * to read or write data.
4342      *
4343      * @param url a <code>String</code> object that contains the JDBC URL
4344      *            that will be used to establish the connection to a database for this
4345      *            <code>RowSet</code> object; may be <code>null</code> but must not
4346      *            be an empty string
4347      * @throws SQLException if an error occurs setting the Url property or the
4348      *         parameter supplied is a string with a length of <code>0</code> (an
4349      *         empty string)
4350      * @see #getUrl
4351      */
4352 
4353     public void setUrl(String url) throws SQLException {
4354 
4355        if(getUrl() != null) {
4356           if(!getUrl().equals(url)) {
4357              super.setUrl(url);
4358              conn = null;
4359              ps = null;
4360              rs = null;
4361           }
4362        }
4363        else {
4364           super.setUrl(url);
4365        }
4366     }
4367 
4368      /**
4369      * Sets the username property for this <code>JdbcRowSet</code> object
4370      * to the given user name. Because it
4371      * is not serialized, the username property is set at run time before
4372      * calling the method <code>execute</code>. In addition,
4373      * if the <code>username</code> property is already set with a
4374      * non-null value and that value is different from the <code>String</code>
4375      * object to be set,
4376      * this method sets this <code>JdbcRowSet</code> object's private fields
4377      * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
4378      * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
4379      * <code>rs</code> is its <code>ResultSet</code> object, and
4380      * <code>conn</code> is its <code>Connection</code> object.)
4381      * Setting these fields to <code>null</code> ensures that only current
4382      * values will be used.
4383      *
4384      * @param uname the <code>String</code> object containing the user name that
4385      *     is supplied to the data source to create a connection. It may be null.
4386      * @see #getUsername
4387      */
4388     public void setUsername(String uname) {
4389 
4390        if( getUsername() != null) {
4391           if(!getUsername().equals(uname)) {
4392              super.setUsername(uname);
4393              conn = null;
4394              ps = null;
4395              rs = null;
4396           }
4397        }
4398        else{
4399           super.setUsername(uname);
4400        }
4401     }
4402 
4403      /**
4404      * Sets the password property for this <code>JdbcRowSet</code> object
4405      * to the given <code>String</code> object. Because it
4406      * is not serialized, the password property is set at run time before
4407      * calling the method <code>execute</code>. Its default valus is
4408      * <code>null</code>. In addition,
4409      * if the <code>password</code> property is already set with a
4410      * non-null value and that value is different from the one being set,
4411      * this method sets this <code>JdbcRowSet</code> object's private fields
4412      * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
4413      * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
4414      * <code>rs</code> is its <code>ResultSet</code> object, and
4415      * <code>conn</code> is its <code>Connection</code> object.)
4416      * Setting these fields to <code>null</code> ensures that only current
4417      * values will be used.
4418      *
4419      * @param password the <code>String</code> object that represents the password
4420      *     that must be supplied to the database to create a connection
4421      */
4422     public void setPassword(String password) {
4423 
4424        if ( getPassword() != null) {
4425           if(!getPassword().equals(password)) {
4426              super.setPassword(password);
4427              conn = null;
4428              ps = null;
4429              rs = null;
4430           }
4431        }
4432        else{
4433           super.setPassword(password);
4434        }
4435     }
4436 
4437     /**
4438      * Sets the type for this <code>RowSet</code> object to the specified type.
4439      * The default type is <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>.
4440      *
4441      * @param type one of the following constants:
4442      *             <code>ResultSet.TYPE_FORWARD_ONLY</code>,
4443      *             <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>, or
4444      *             <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
4445      * @throws SQLException if the parameter supplied is not one of the
4446      *         following constants:
4447      *          <code>ResultSet.TYPE_FORWARD_ONLY</code> or
4448      *          <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>
4449      *          <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
4450      * @see #getConcurrency
4451      * @see #getType
4452      */
4453 
4454     public void setType(int type) throws SQLException {
4455 
4456        int oldVal;
4457 
4458        try {
4459           oldVal = getType();
4460         }catch(SQLException ex) {
4461            oldVal = 0;
4462         }
4463 
4464        if(oldVal != type) {
4465            super.setType(type);
4466        }
4467 
4468     }
4469 
4470     /**
4471      * Sets the concurrency for this <code>RowSet</code> object to
4472      * the specified concurrency. The default concurrency for any <code>RowSet</code>
4473      * object (connected or disconnected) is <code>ResultSet.CONCUR_UPDATABLE</code>,
4474      * but this method may be called at any time to change the concurrency.
4475      *
4476      * @param concur one of the following constants:
4477      *                    <code>ResultSet.CONCUR_READ_ONLY</code> or
4478      *                    <code>ResultSet.CONCUR_UPDATABLE</code>
4479      * @throws SQLException if the parameter supplied is not one of the
4480      *         following constants:
4481      *          <code>ResultSet.CONCUR_UPDATABLE</code> or
4482      *          <code>ResultSet.CONCUR_READ_ONLY</code>
4483      * @see #getConcurrency
4484      * @see #isReadOnly
4485      */
4486     public void setConcurrency(int concur) throws SQLException {
4487 
4488        int oldVal;
4489 
4490        try {
4491           oldVal = getConcurrency();
4492         }catch(NullPointerException ex) {
4493            oldVal = 0;
4494         }
4495 
4496        if(oldVal != concur) {
4497            super.setConcurrency(concur);
4498        }
4499 
4500     }
4501 
4502     /**
4503      * Retrieves the value of the designated <code>SQL XML</code> parameter as a
4504      * <code>SQLXML</code> object in the Java programming language.
4505      * @param columnIndex the first column is 1, the second is 2, ...
4506      * @return a SQLXML object that maps an SQL XML value
4507      * @throws SQLException if a database access error occurs
4508      * @since 1.6
4509      */
4510     public SQLXML getSQLXML(int columnIndex) throws SQLException {
4511         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4512     }
4513 
4514     /**
4515      * Retrieves the value of the designated <code>SQL XML</code> parameter as a
4516      * <code>SQLXML</code> object in the Java programming language.
4517      * @param colName the name of the column from which to retrieve the value
4518      * @return a SQLXML object that maps an SQL XML value
4519      * @throws SQLException if a database access error occurs
4520      */
4521     public SQLXML getSQLXML(String colName) throws SQLException {
4522         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4523     }
4524 
4525     /**
4526      * Retrieves the value of the designated column in the current row of this
4527      * <code>ResultSet</code> object as a java.sql.RowId object in the Java
4528      * programming language.
4529      *
4530      * @param columnIndex the first column is 1, the second 2, ...
4531      * @return the column value if the value is a SQL <code>NULL</code> the
4532      *     value returned is <code>null</code>
4533      * @throws SQLException if a database access error occurs
4534      * @since 1.6
4535      */
4536     public RowId getRowId(int columnIndex) throws SQLException {
4537         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4538     }
4539 
4540     /**
4541      * Retrieves the value of the designated column in the current row of this
4542      * <code>ResultSet</code> object as a java.sql.RowId object in the Java
4543      * programming language.
4544      *
4545      * @param columnName the name of the column
4546      * @return the column value if the value is a SQL <code>NULL</code> the
4547      *     value returned is <code>null</code>
4548      * @throws SQLException if a database access error occurs
4549      * @since 1.6
4550      */
4551     public RowId getRowId(String columnName) throws SQLException {
4552         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4553     }
4554 
4555     /**
4556      * Updates the designated column with a <code>RowId</code> value. The updater
4557      * methods are used to update column values in the current row or the insert
4558      * row. The updater methods do not update the underlying database; instead
4559      * the <code>updateRow<code> or <code>insertRow</code> methods are called
4560      * to update the database.
4561      *
4562      * @param columnIndex the first column is 1, the second 2, ...
4563      * @param x the column value
4564      * @throws SQLException if a database access occurs
4565      * @since 1.6
4566      */
4567     public void updateRowId(int columnIndex, RowId x) throws SQLException {
4568         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4569     }
4570 
4571     /**
4572      * Updates the designated column with a <code>RowId</code> value. The updater
4573      * methods are used to update column values in the current row or the insert
4574      * row. The updater methods do not update the underlying database; instead
4575      * the <code>updateRow<code> or <code>insertRow</code> methods are called
4576      * to update the database.
4577      *
4578      * @param columnName the name of the column
4579      * @param x the column value
4580      * @throws SQLException if a database access occurs
4581      * @since 1.6
4582      */
4583     public void updateRowId(String columnName, RowId x) throws SQLException {
4584         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4585     }
4586 
4587     /**
4588      * Retrieves the holdability of this ResultSet object
4589      * @return  either ResultSet.HOLD_CURSORS_OVER_COMMIT or ResultSet.CLOSE_CURSORS_AT_COMMIT
4590      * @throws SQLException if a database error occurs
4591      * @since 1.6
4592      */
4593     public int getHoldability() throws SQLException {
4594         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4595     }
4596 
4597     /**
4598      * Retrieves whether this ResultSet object has been closed. A ResultSet is closed if the
4599      * method close has been called on it, or if it is automatically closed.
4600      * @return true if this ResultSet object is closed; false if it is still open
4601      * @throws SQLException if a database access error occurs
4602      * @since 1.6
4603      */
4604     public boolean isClosed() throws SQLException {
4605         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4606     }
4607 
4608     /**
4609      * This method is used for updating columns that support National Character sets.
4610      * It can be used for updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
4611      * @param columnIndex the first column is 1, the second 2, ...
4612      * @param nString the value for the column to be updated
4613      * @throws SQLException if a database access error occurs
4614      * @since 1.6
4615      */
4616     public void updateNString(int columnIndex, String nString) throws SQLException {
4617         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4618     }
4619 
4620     /**
4621      * This method is used for updating columns that support National Character sets.
4622      * It can be used for updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
4623      * @param columnName name of the Column
4624      * @param nString the value for the column to be updated
4625      * @throws SQLException if a database access error occurs
4626      * @since 1.6
4627      */
4628     public void updateNString(String columnName, String nString) throws SQLException {
4629         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4630     }
4631 
4632 
4633     /*o
4634      * This method is used for updating SQL <code>NCLOB</code>  type that maps
4635      * to <code>java.sql.Types.NCLOB</code>
4636      * @param columnIndex the first column is 1, the second 2, ...
4637      * @param nClob the value for the column to be updated
4638      * @throws SQLException if a database access error occurs
4639      * @since 1.6
4640      */
4641     public void updateNClob(int columnIndex, NClob nClob) throws SQLException {
4642         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4643     }
4644 
4645     /**
4646      * This method is used for updating SQL <code>NCLOB</code>  type that maps
4647      * to <code>java.sql.Types.NCLOB</code>
4648      * @param columnName name of the column
4649      * @param nClob the value for the column to be updated
4650      * @throws SQLException if a database access error occurs
4651      * @since 1.6
4652      */
4653     public void updateNClob(String columnName, NClob nClob) throws SQLException {
4654         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4655     }
4656 
4657     /**
4658      * Retrieves the value of the designated column in the current row
4659      * of this <code>ResultSet</code> object as a <code>NClob</code> object
4660      * in the Java programming language.
4661      *
4662      * @param i the first column is 1, the second is 2, ...
4663      * @return a <code>NClob</code> object representing the SQL
4664      *         <code>NCLOB</code> value in the specified column
4665      * @exception SQLException if a database access error occurs
4666      * @since 1.6
4667      */
4668     public NClob getNClob(int i) throws SQLException {
4669         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4670     }
4671 
4672 
4673   /**
4674      * Retrieves the value of the designated column in the current row
4675      * of this <code>ResultSet</code> object as a <code>NClob</code> object
4676      * in the Java programming language.
4677      *
4678      * @param colName the name of the column from which to retrieve the value
4679      * @return a <code>NClob</code> object representing the SQL <code>NCLOB</code>
4680      * value in the specified column
4681      * @exception SQLException if a database access error occurs
4682      * @since 1.6
4683      */
4684     public NClob getNClob(String colName) throws SQLException {
4685         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4686     }
4687 
4688     public <T> T unwrap(java.lang.Class<T> iface) throws java.sql.SQLException{
4689         return null;
4690     }
4691 
4692     public boolean isWrapperFor(Class<?> interfaces) throws SQLException {
4693         return false;
4694     }
4695 
4696     /**
4697       * Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver converts this to an
4698       * SQL <code>XML</code> value when it sends it to the database.
4699       * @param parameterIndex index of the first parameter is 1, the second is 2, ...
4700       * @param xmlObject a <code>SQLXML</code> object that maps an SQL <code>XML</code> value
4701       * @throws SQLException if a database access error occurs
4702       * @since 1.6
4703       */
4704      public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException {
4705          throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4706      }
4707 
4708     /**
4709      * Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver converts this to an
4710      * <code>SQL XML</code> value when it sends it to the database.
4711      * @param parameterName the name of the parameter
4712      * @param xmlObject a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
4713      * @throws SQLException if a database access error occurs
4714      * @since 1.6
4715      */
4716     public void setSQLXML(String parameterName, SQLXML xmlObject) throws SQLException {
4717          throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4718      }
4719 
4720     /**
4721      * Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
4722      * driver converts this to a SQL <code>ROWID</code> value when it sends it
4723      * to the database
4724      *
4725      * @param parameterIndex the first parameter is 1, the second is 2, ...
4726      * @param x the parameter value
4727      * @throws SQLException if a database access error occurs
4728      *
4729      * @since 1.6
4730      */
4731     public void setRowId(int parameterIndex, RowId x) throws SQLException {
4732          throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4733      }
4734 
4735     /**
4736     * Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
4737     * driver converts this to a SQL <code>ROWID</code> when it sends it to the
4738     * database.
4739     *
4740     * @param parameterName the name of the parameter
4741     * @param x the parameter value
4742     * @throws SQLException if a database access error occurs
4743     * @since 1.6
4744     */
4745    public void setRowId(String parameterName, RowId x) throws SQLException {
4746          throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4747      }
4748 
4749 
4750    /**
4751      * Sets the designated parameter to the given <code>String</code> object.
4752      * The driver converts this to a SQL <code>NCHAR</code> or
4753      * <code>NVARCHAR</code> or <code>LONGNVARCHAR</code> value
4754      * (depending on the argument's
4755      * size relative to the driver's limits on <code>NVARCHAR</code> values)
4756      * when it sends it to the database.
4757      *
4758      * @param parameterIndex of the first parameter is 1, the second is 2, ...
4759      * @param value the parameter value
4760      * @throws SQLException if the driver does not support national
4761      *         character sets;  if the driver can detect that a data conversion
4762      *  error could occur ; or if a database access error occurs
4763      * @since 1.6
4764      */
4765      public void setNString(int parameterIndex, String value) throws SQLException {
4766         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4767      }
4768 
4769 
4770    /**
4771     * Sets the designated parameter in this <code>RowSet</code> object's command
4772     * to a <code>Reader</code> object. The
4773     * <code>Reader</code> reads the data till end-of-file is reached. The
4774     * driver does the necessary conversion from Java character format to
4775     * the national character set in the database.
4776 
4777     * <P><B>Note:</B> This stream object can either be a standard
4778     * Java stream object or your own subclass that implements the
4779     * standard interface.
4780     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4781     * it might be more efficient to use a version of
4782     * <code>setNCharacterStream</code> which takes a length parameter.
4783     *
4784     * @param parameterIndex of the first parameter is 1, the second is 2, ...
4785     * @param value the parameter value
4786     * @throws SQLException if the driver does not support national
4787     *         character sets;  if the driver can detect that a data conversion
4788     *  error could occur ; if a database access error occurs; or
4789     * this method is called on a closed <code>PreparedStatement</code>
4790     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
4791     * @since 1.6
4792     */
4793     public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException {
4794         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4795     }
4796 
4797   /**
4798     * Sets the designated parameter to a <code>java.sql.NClob</code> object. The object
4799     * implements the <code>java.sql.NClob</code> interface. This <code>NClob</code>
4800     * object maps to a SQL <code>NCLOB</code>.
4801     * @param parameterName the name of the column to be set
4802     * @param value the parameter value
4803     * @throws SQLException if the driver does not support national
4804     *         character sets;  if the driver can detect that a data conversion
4805     *  error could occur; or if a database access error occurs
4806     * @since 1.6
4807     */
4808     public void setNClob(String parameterName, NClob value) throws SQLException {
4809          throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4810      }
4811 
4812 
4813   /**
4814      * Retrieves the value of the designated column in the current row
4815      * of this <code>ResultSet</code> object as a
4816      * <code>java.io.Reader</code> object.
4817      * It is intended for use when
4818      * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
4819      * and <code>LONGNVARCHAR</code> columns.
4820      *
4821      * @return a <code>java.io.Reader</code> object that contains the column
4822      * value; if the value is SQL <code>NULL</code>, the value returned is
4823      * <code>null</code> in the Java programming language.
4824      * @param columnIndex the first column is 1, the second is 2, ...
4825      * @exception SQLException if a database access error occurs
4826      * @since 1.6
4827      */
4828     public java.io.Reader getNCharacterStream(int columnIndex) throws SQLException {
4829        throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4830      }
4831 
4832 
4833     /**
4834      * Retrieves the value of the designated column in the current row
4835      * of this <code>ResultSet</code> object as a
4836      * <code>java.io.Reader</code> object.
4837      * It is intended for use when
4838      * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
4839      * and <code>LONGNVARCHAR</code> columns.
4840      *
4841      * @param columnName the name of the column
4842      * @return a <code>java.io.Reader</code> object that contains the column
4843      * value; if the value is SQL <code>NULL</code>, the value returned is
4844      * <code>null</code> in the Java programming language
4845      * @exception SQLException if a database access error occurs
4846      * @since 1.6
4847      */
4848     public java.io.Reader getNCharacterStream(String columnName) throws SQLException {
4849        throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4850      }
4851 
4852     /**
4853      * Updates the designated column with a <code>java.sql.SQLXML</code> value.
4854      * The updater
4855      * methods are used to update column values in the current row or the insert
4856      * row. The updater methods do not update the underlying database; instead
4857      * the <code>updateRow</code> or <code>insertRow</code> methods are called
4858      * to update the database.
4859      * @param columnIndex the first column is 1, the second 2, ...
4860      * @param xmlObject the value for the column to be updated
4861      * @throws SQLException if a database access error occurs
4862      * @since 1.6
4863      */
4864     public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException {
4865         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4866     }
4867 
4868     /**
4869      * Updates the designated column with a <code>java.sql.SQLXML</code> value.
4870      * The updater
4871      * methods are used to update column values in the current row or the insert
4872      * row. The updater methods do not update the underlying database; instead
4873      * the <code>updateRow</code> or <code>insertRow</code> methods are called
4874      * to update the database.
4875      *
4876      * @param columnName the name of the column
4877      * @param xmlObject the column value
4878      * @throws SQLException if a database access occurs
4879      * @since 1.6
4880      */
4881     public void updateSQLXML(String columnName, SQLXML xmlObject) throws SQLException {
4882         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4883     }
4884 
4885      /**
4886      * Retrieves the value of the designated column in the current row
4887      * of this <code>ResultSet</code> object as
4888      * a <code>String</code> in the Java programming language.
4889      * It is intended for use when
4890      * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
4891      * and <code>LONGNVARCHAR</code> columns.
4892      *
4893      * @param columnIndex the first column is 1, the second is 2, ...
4894      * @return the column value; if the value is SQL <code>NULL</code>, the
4895      * value returned is <code>null</code>
4896      * @exception SQLException if a database access error occurs
4897      * @since 1.6
4898      */
4899     public String getNString(int columnIndex) throws SQLException {
4900         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4901     }
4902 
4903     /**
4904      * Retrieves the value of the designated column in the current row
4905      * of this <code>ResultSet</code> object as
4906      * a <code>String</code> in the Java programming language.
4907      * It is intended for use when
4908      * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
4909      * and <code>LONGNVARCHAR</code> columns.
4910      *
4911      * @param columnName the SQL name of the column
4912      * @return the column value; if the value is SQL <code>NULL</code>, the
4913      * value returned is <code>null</code>
4914      * @exception SQLException if a database access error occurs
4915      * @since 1.6
4916      */
4917     public String getNString(String columnName) throws SQLException {
4918         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4919     }
4920 
4921      /**
4922        * Updates the designated column with a character stream value, which will
4923        * have the specified number of bytes. The driver does the necessary conversion
4924        * from Java character format to the national character set in the database.
4925        * It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
4926        * The updater methods are used to update column values in the current row or
4927        * the insert row. The updater methods do not update the underlying database;
4928        * instead the updateRow or insertRow methods are called to update the database.
4929        *
4930        * @param columnIndex - the first column is 1, the second is 2, ...
4931        * @param x - the new column value
4932        * @param length - the length of the stream
4933        * @exception SQLException if a database access error occurs
4934        * @since 1.6
4935        */
4936        public void updateNCharacterStream(int columnIndex,
4937                             java.io.Reader x,
4938                             long length)
4939                             throws SQLException {
4940           throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4941        }
4942 
4943      /**
4944        * Updates the designated column with a character stream value, which will
4945        * have the specified number of bytes. The driver does the necessary conversion
4946        * from Java character format to the national character set in the database.
4947        * It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
4948        * The updater methods are used to update column values in the current row or
4949        * the insert row. The updater methods do not update the underlying database;
4950        * instead the updateRow or insertRow methods are called to update the database.
4951        *
4952        * @param columnName - name of the Column
4953        * @param x - the new column value
4954        * @param length - the length of the stream
4955        * @exception SQLException if a database access error occurs
4956        * @since 1.6
4957        */
4958        public void updateNCharacterStream(String columnName,
4959                             java.io.Reader x,
4960                             long length)
4961                             throws SQLException {
4962           throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4963        }
4964 
4965     /**
4966      * Updates the designated column with a character stream value.   The
4967      * driver does the necessary conversion from Java character format to
4968      * the national character set in the database.
4969      * It is intended for use when
4970      * updating  <code>NCHAR</code>,<code>NVARCHAR</code>
4971      * and <code>LONGNVARCHAR</code> columns.
4972      *
4973      * The updater methods are used to update column values in the
4974      * current row or the insert row.  The updater methods do not
4975      * update the underlying database; instead the <code>updateRow</code> or
4976      * <code>insertRow</code> methods are called to update the database.
4977      *
4978      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
4979      * it might be more efficient to use a version of
4980      * <code>updateNCharacterStream</code> which takes a length parameter.
4981      *
4982      * @param columnIndex the first column is 1, the second is 2, ...
4983      * @param x the new column value
4984      * @exception SQLException if a database access error occurs,
4985      * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
4986      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
4987      * this method
4988      * @since 1.6
4989      */
4990     public void updateNCharacterStream(int columnIndex,
4991                              java.io.Reader x) throws SQLException {
4992         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
4993     }
4994 
4995     /**
4996      * Updates the designated column with a character stream value.  The
4997      * driver does the necessary conversion from Java character format to
4998      * the national character set in the database.
4999      * It is intended for use when
5000      * updating  <code>NCHAR</code>,<code>NVARCHAR</code>
5001      * and <code>LONGNVARCHAR</code> columns.
5002      *
5003      * The updater methods are used to update column values in the
5004      * current row or the insert row.  The updater methods do not
5005      * update the underlying database; instead the <code>updateRow</code> or
5006      * <code>insertRow</code> methods are called to update the database.
5007      *
5008      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5009      * it might be more efficient to use a version of
5010      * <code>updateNCharacterStream</code> which takes a length parameter.
5011      *
5012      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
5013 bel is the name of the column
5014      * @param reader the <code>java.io.Reader</code> object containing
5015      *        the new column value
5016      * @exception SQLException if a database access error occurs,
5017      * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
5018       * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5019      * this method
5020      * @since 1.6
5021      */
5022     public void updateNCharacterStream(String columnLabel,
5023                              java.io.Reader reader) throws SQLException {
5024         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5025     }
5026 
5027     /**
5028      * Updates the designated column using the given input stream, which
5029      * will have the specified number of bytes.
5030      * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
5031      * parameter, it may be more practical to send it via a
5032      * <code>java.io.InputStream</code>. Data will be read from the stream
5033      * as needed until end-of-file is reached.  The JDBC driver will
5034      * do any necessary conversion from ASCII to the database char format.
5035      *
5036      * <P><B>Note:</B> This stream object can either be a standard
5037      * Java stream object or your own subclass that implements the
5038      * standard interface.
5039      * <p>
5040      * The updater methods are used to update column values in the
5041      * current row or the insert row.  The updater methods do not
5042      * update the underlying database; instead the <code>updateRow</code> or
5043      * <code>insertRow</code> methods are called to update the database.
5044      *
5045      * @param columnIndex the first column is 1, the second is 2, ...
5046      * @param inputStream An object that contains the data to set the parameter
5047      * value to.
5048      * @param length the number of bytes in the parameter data.
5049      * @exception SQLException if a database access error occurs,
5050      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5051      * or this method is called on a closed result set
5052      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5053      * this method
5054      * @since 1.6
5055      */
5056     public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException{
5057         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5058     }
5059 
5060     /**
5061      * Updates the designated column using the given input stream, which
5062      * will have the specified number of bytes.
5063      * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
5064      * parameter, it may be more practical to send it via a
5065      * <code>java.io.InputStream</code>. Data will be read from the stream
5066      * as needed until end-of-file is reached.  The JDBC driver will
5067      * do any necessary conversion from ASCII to the database char format.
5068      *
5069      * <P><B>Note:</B> This stream object can either be a standard
5070      * Java stream object or your own subclass that implements the
5071      * standard interface.
5072      * <p>
5073      * The updater methods are used to update column values in the
5074      * current row or the insert row.  The updater methods do not
5075      * update the underlying database; instead the <code>updateRow</code> or
5076      * <code>insertRow</code> methods are called to update the database.
5077      *
5078      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
5079      * @param inputStream An object that contains the data to set the parameter
5080      * value to.
5081      * @param length the number of bytes in the parameter data.
5082      * @exception SQLException if a database access error occurs,
5083      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5084      * or this method is called on a closed result set
5085      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5086      * this method
5087      * @since 1.6
5088      */
5089     public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException {
5090         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5091     }
5092 
5093     /**
5094      * Updates the designated column using the given input stream.
5095      * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
5096      * parameter, it may be more practical to send it via a
5097      * <code>java.io.InputStream</code>. Data will be read from the stream
5098      * as needed until end-of-file is reached.  The JDBC driver will
5099      * do any necessary conversion from ASCII to the database char format.
5100      *
5101      * <P><B>Note:</B> This stream object can either be a standard
5102      * Java stream object or your own subclass that implements the
5103      * standard interface.
5104      *
5105      *  <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5106      * it might be more efficient to use a version of
5107      * <code>updateBlob</code> which takes a length parameter.
5108      * <p>
5109      * The updater methods are used to update column values in the
5110      * current row or the insert row.  The updater methods do not
5111      * update the underlying database; instead the <code>updateRow</code> or
5112      * <code>insertRow</code> methods are called to update the database.
5113      *
5114      * @param columnIndex the first column is 1, the second is 2, ...
5115      * @param inputStream An object that contains the data to set the parameter
5116      * value to.
5117      * @exception SQLException if a database access error occurs,
5118      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5119      * or this method is called on a closed result set
5120      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5121      * this method
5122      * @since 1.6
5123      */
5124     public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException {
5125         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5126     }
5127 
5128     /**
5129      * Updates the designated column using the given input stream.
5130      * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
5131      * parameter, it may be more practical to send it via a
5132      * <code>java.io.InputStream</code>. Data will be read from the stream
5133      * as needed until end-of-file is reached.  The JDBC driver will
5134      * do any necessary conversion from ASCII to the database char format.
5135      *
5136      * <P><B>Note:</B> This stream object can either be a standard
5137      * Java stream object or your own subclass that implements the
5138      * standard interface.
5139      *   <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5140      * it might be more efficient to use a version of
5141      * <code>updateBlob</code> which takes a length parameter.
5142      * <p>
5143      * The updater methods are used to update column values in the
5144      * current row or the insert row.  The updater methods do not
5145      * update the underlying database; instead the <code>updateRow</code> or
5146      * <code>insertRow</code> methods are called to update the database.
5147      *
5148      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
5149 bel is the name of the column
5150      * @param inputStream An object that contains the data to set the parameter
5151      * value to.
5152      * @exception SQLException if a database access error occurs,
5153      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5154      * or this method is called on a closed result set
5155      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5156      * this method
5157      * @since 1.6
5158      */
5159     public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException {
5160         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5161     }
5162 
5163     /**
5164      * Updates the designated column using the given <code>Reader</code>
5165      * object, which is the given number of characters long.
5166      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
5167      * parameter, it may be more practical to send it via a
5168      * <code>java.io.Reader</code> object. The data will be read from the stream
5169      * as needed until end-of-file is reached.  The JDBC driver will
5170      * do any necessary conversion from UNICODE to the database char format.
5171      *
5172      * <P><B>Note:</B> This stream object can either be a standard
5173      * Java stream object or your own subclass that implements the
5174      * standard interface.
5175      * <p>
5176      * The updater methods are used to update column values in the
5177      * current row or the insert row.  The updater methods do not
5178      * update the underlying database; instead the <code>updateRow</code> or
5179      * <code>insertRow</code> methods are called to update the database.
5180      *
5181      * @param columnIndex the first column is 1, the second is 2, ...
5182      * @param reader An object that contains the data to set the parameter value to.
5183      * @param length the number of characters in the parameter data.
5184      * @exception SQLException if a database access error occurs,
5185      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5186      * or this method is called on a closed result set
5187      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5188      * this method
5189      * @since 1.6
5190      */
5191     public void updateClob(int columnIndex,  Reader reader, long length) throws SQLException {
5192         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5193     }
5194 
5195     /**
5196      * Updates the designated column using the given <code>Reader</code>
5197      * object, which is the given number of characters long.
5198      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
5199      * parameter, it may be more practical to send it via a
5200      * <code>java.io.Reader</code> object. The data will be read from the stream
5201      * as needed until end-of-file is reached.  The JDBC driver will
5202      * do any necessary conversion from UNICODE to the database char format.
5203      *
5204      * <P><B>Note:</B> This stream object can either be a standard
5205      * Java stream object or your own subclass that implements the
5206      * standard interface.
5207      * <p>
5208      * The updater methods are used to update column values in the
5209      * current row or the insert row.  The updater methods do not
5210      * update the underlying database; instead the <code>updateRow</code> or
5211      * <code>insertRow</code> methods are called to update the database.
5212      *
5213      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
5214      * @param reader An object that contains the data to set the parameter value to.
5215      * @param length the number of characters in the parameter data.
5216      * @exception SQLException if a database access error occurs,
5217      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5218      * or this method is called on a closed result set
5219      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5220      * this method
5221      * @since 1.6
5222      */
5223     public void updateClob(String columnLabel,  Reader reader, long length) throws SQLException {
5224         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5225     }
5226 
5227     /**
5228      * Updates the designated column using the given <code>Reader</code>
5229      * object.
5230      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
5231      * parameter, it may be more practical to send it via a
5232      * <code>java.io.Reader</code> object. The data will be read from the stream
5233      * as needed until end-of-file is reached.  The JDBC driver will
5234      * do any necessary conversion from UNICODE to the database char format.
5235      *
5236      * <P><B>Note:</B> This stream object can either be a standard
5237      * Java stream object or your own subclass that implements the
5238      * standard interface.
5239      *   <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5240      * it might be more efficient to use a version of
5241      * <code>updateClob</code> which takes a length parameter.
5242      * <p>
5243      * The updater methods are used to update column values in the
5244      * current row or the insert row.  The updater methods do not
5245      * update the underlying database; instead the <code>updateRow</code> or
5246      * <code>insertRow</code> methods are called to update the database.
5247      *
5248      * @param columnIndex the first column is 1, the second is 2, ...
5249      * @param reader An object that contains the data to set the parameter value to.
5250      * @exception SQLException if a database access error occurs,
5251      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5252      * or this method is called on a closed result set
5253      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5254      * this method
5255      * @since 1.6
5256      */
5257     public void updateClob(int columnIndex,  Reader reader) throws SQLException {
5258         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5259     }
5260 
5261     /**
5262      * Updates the designated column using the given <code>Reader</code>
5263      * object.
5264      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
5265      * parameter, it may be more practical to send it via a
5266      * <code>java.io.Reader</code> object. The data will be read from the stream
5267      * as needed until end-of-file is reached.  The JDBC driver will
5268      * do any necessary conversion from UNICODE to the database char format.
5269      *
5270      * <P><B>Note:</B> This stream object can either be a standard
5271      * Java stream object or your own subclass that implements the
5272      * standard interface.
5273      *  <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5274      * it might be more efficient to use a version of
5275      * <code>updateClob</code> which takes a length parameter.
5276      * <p>
5277      * The updater methods are used to update column values in the
5278      * current row or the insert row.  The updater methods do not
5279      * update the underlying database; instead the <code>updateRow</code> or
5280      * <code>insertRow</code> methods are called to update the database.
5281      *
5282      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
5283 bel is the name of the column
5284      * @param reader An object that contains the data to set the parameter value to.
5285      * @exception SQLException if a database access error occurs,
5286      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5287      * or this method is called on a closed result set
5288      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5289      * this method
5290      * @since 1.6
5291      */
5292     public void updateClob(String columnLabel,  Reader reader) throws SQLException {
5293         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5294     }
5295 
5296    /**
5297      * Updates the designated column using the given <code>Reader</code>
5298      * object, which is the given number of characters long.
5299      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
5300      * parameter, it may be more practical to send it via a
5301      * <code>java.io.Reader</code> object. The data will be read from the stream
5302      * as needed until end-of-file is reached.  The JDBC driver will
5303      * do any necessary conversion from UNICODE to the database char format.
5304      *
5305      * <P><B>Note:</B> This stream object can either be a standard
5306      * Java stream object or your own subclass that implements the
5307      * standard interface.
5308      * <p>
5309      * The updater methods are used to update column values in the
5310      * current row or the insert row.  The updater methods do not
5311      * update the underlying database; instead the <code>updateRow</code> or
5312      * <code>insertRow</code> methods are called to update the database.
5313      *
5314      * @param columnIndex the first column is 1, the second 2, ...
5315      * @param reader An object that contains the data to set the parameter value to.
5316      * @param length the number of characters in the parameter data.
5317      * @throws SQLException if the driver does not support national
5318      *         character sets;  if the driver can detect that a data conversion
5319      *  error could occur; this method is called on a closed result set,
5320      * if a database access error occurs or
5321      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5322      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5323      * this method
5324      * @since 1.6
5325      */
5326     public void updateNClob(int columnIndex,  Reader reader, long length) throws SQLException {
5327         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5328     }
5329 
5330     /**
5331      * Updates the designated column using the given <code>Reader</code>
5332      * object, which is the given number of characters long.
5333      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
5334      * parameter, it may be more practical to send it via a
5335      * <code>java.io.Reader</code> object. The data will be read from the stream
5336      * as needed until end-of-file is reached.  The JDBC driver will
5337      * do any necessary conversion from UNICODE to the database char format.
5338      *
5339      * <P><B>Note:</B> This stream object can either be a standard
5340      * Java stream object or your own subclass that implements the
5341      * standard interface.
5342      * <p>
5343      * The updater methods are used to update column values in the
5344      * current row or the insert row.  The updater methods do not
5345      * update the underlying database; instead the <code>updateRow</code> or
5346      * <code>insertRow</code> methods are called to update the database.
5347      *
5348      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
5349      * @param reader An object that contains the data to set the parameter value to.
5350      * @param length the number of characters in the parameter data.
5351      * @throws SQLException if the driver does not support national
5352      *         character sets;  if the driver can detect that a data conversion
5353      *  error could occur; this method is called on a closed result set;
5354      *  if a database access error occurs or
5355      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5356      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5357      * this method
5358      * @since 1.6
5359      */
5360     public void updateNClob(String columnLabel,  Reader reader, long length) throws SQLException {
5361         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5362     }
5363 
5364     /**
5365      * Updates the designated column using the given <code>Reader</code>
5366      * object.
5367      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
5368      * parameter, it may be more practical to send it via a
5369      * <code>java.io.Reader</code> object. The data will be read from the stream
5370      * as needed until end-of-file is reached.  The JDBC driver will
5371      * do any necessary conversion from UNICODE to the database char format.
5372      *
5373      * <P><B>Note:</B> This stream object can either be a standard
5374      * Java stream object or your own subclass that implements the
5375      * standard interface.
5376      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5377      * it might be more efficient to use a version of
5378      * <code>updateNClob</code> which takes a length parameter.
5379      * <p>
5380      * The updater methods are used to update column values in the
5381      * current row or the insert row.  The updater methods do not
5382      * update the underlying database; instead the <code>updateRow</code> or
5383      * <code>insertRow</code> methods are called to update the database.
5384      *
5385      * @param columnIndex the first column is 1, the second 2, ...
5386      * @param reader An object that contains the data to set the parameter value to.
5387      * @throws SQLException if the driver does not support national
5388      *         character sets;  if the driver can detect that a data conversion
5389      *  error could occur; this method is called on a closed result set,
5390      * if a database access error occurs or
5391      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5392      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5393      * this method
5394      * @since 1.6
5395      */
5396     public void updateNClob(int columnIndex,  Reader reader) throws SQLException {
5397         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5398     }
5399 
5400     /**
5401      * Updates the designated column using the given <code>Reader</code>
5402      * object.
5403      * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
5404      * parameter, it may be more practical to send it via a
5405      * <code>java.io.Reader</code> object. The data will be read from the stream
5406      * as needed until end-of-file is reached.  The JDBC driver will
5407      * do any necessary conversion from UNICODE to the database char format.
5408      *
5409      * <P><B>Note:</B> This stream object can either be a standard
5410      * Java stream object or your own subclass that implements the
5411      * standard interface.
5412      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5413      * it might be more efficient to use a version of
5414      * <code>updateNClob</code> which takes a length parameter.
5415      * <p>
5416      * The updater methods are used to update column values in the
5417      * current row or the insert row.  The updater methods do not
5418      * update the underlying database; instead the <code>updateRow</code> or
5419      * <code>insertRow</code> methods are called to update the database.
5420      *
5421      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
5422 bel is the name of the column
5423      * @param reader An object that contains the data to set the parameter value to.
5424      * @throws SQLException if the driver does not support national
5425      *         character sets;  if the driver can detect that a data conversion
5426      *  error could occur; this method is called on a closed result set;
5427      *  if a database access error occurs or
5428      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5429      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5430      * this method
5431      * @since 1.6
5432      */
5433     public void updateNClob(String columnLabel,  Reader reader) throws SQLException {
5434         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5435     }
5436 
5437 
5438         /**
5439      * Updates the designated column with an ascii stream value, which will have
5440      * the specified number of bytes.
5441      * The updater methods are used to update column values in the
5442      * current row or the insert row.  The updater methods do not
5443      * update the underlying database; instead the <code>updateRow</code> or
5444      * <code>insertRow</code> methods are called to update the database.
5445      *
5446      * @param columnIndex the first column is 1, the second is 2, ...
5447      * @param x the new column value
5448      * @param length the length of the stream
5449      * @exception SQLException if a database access error occurs,
5450      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5451      * or this method is called on a closed result set
5452      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5453      * this method
5454      * @since 1.6
5455      */
5456     public void updateAsciiStream(int columnIndex,
5457                            java.io.InputStream x,
5458                            long length) throws SQLException {
5459         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5460     }
5461 
5462     /**
5463      * Updates the designated column with a binary stream value, which will have
5464      * the specified number of bytes.
5465      * The updater methods are used to update column values in the
5466      * current row or the insert row.  The updater methods do not
5467      * update the underlying database; instead the <code>updateRow</code> or
5468      * <code>insertRow</code> methods are called to update the database.
5469      *
5470      * @param columnIndex the first column is 1, the second is 2, ...
5471      * @param x the new column value
5472      * @param length the length of the stream
5473      * @exception SQLException if a database access error occurs,
5474      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5475      * or this method is called on a closed result set
5476      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5477      * this method
5478      * @since 1.6
5479      */
5480     public void updateBinaryStream(int columnIndex,
5481                             java.io.InputStream x,
5482                             long length) throws SQLException {
5483         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5484     }
5485 
5486     /**
5487      * Updates the designated column with a character stream value, which will have
5488      * the specified number of bytes.
5489      * The updater methods are used to update column values in the
5490      * current row or the insert row.  The updater methods do not
5491      * update the underlying database; instead the <code>updateRow</code> or
5492      * <code>insertRow</code> methods are called to update the database.
5493      *
5494      * @param columnIndex the first column is 1, the second is 2, ...
5495      * @param x the new column value
5496      * @param length the length of the stream
5497      * @exception SQLException if a database access error occurs,
5498      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5499      * or this method is called on a closed result set
5500      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5501      * this method
5502      * @since 1.6
5503      */
5504     public void updateCharacterStream(int columnIndex,
5505                              java.io.Reader x,
5506                              long length) throws SQLException {
5507         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5508     }
5509 
5510      /**
5511      * Updates the designated column with an ascii stream value, which will have
5512      * the specified number of bytes..
5513      * The updater methods are used to update column values in the
5514      * current row or the insert row.  The updater methods do not
5515      * update the underlying database; instead the <code>updateRow</code> or
5516      * <code>insertRow</code> methods are called to update the database.
5517      *
5518      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
5519      * @param x the new column value
5520      * @param length the length of the stream
5521      * @exception SQLException if a database access error occurs,
5522      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5523      * or this method is called on a closed result set
5524      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5525      * this method
5526      * @since 1.6
5527      */
5528     public void updateAsciiStream(String columnLabel,
5529                            java.io.InputStream x,
5530                            long length) throws SQLException {
5531         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5532     }
5533 
5534     /**
5535      * Updates the designated column with an ascii stream value.
5536      * The updater methods are used to update column values in the
5537      * current row or the insert row.  The updater methods do not
5538      * update the underlying database; instead the <code>updateRow</code> or
5539      * <code>insertRow</code> methods are called to update the database.
5540      *
5541      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5542      * it might be more efficient to use a version of
5543      * <code>updateAsciiStream</code> which takes a length parameter.
5544      *
5545      * @param columnIndex the first column is 1, the second is 2, ...
5546      * @param x the new column value
5547      * @exception SQLException if a database access error occurs,
5548      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5549      * or this method is called on a closed result set
5550      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5551      * this method
5552      * @since 1.6
5553      */
5554     public void updateAsciiStream(int columnIndex,
5555                            java.io.InputStream x) throws SQLException {
5556         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5557     }
5558 
5559     /**
5560      * Updates the designated column with an ascii stream value.
5561      * The updater methods are used to update column values in the
5562      * current row or the insert row.  The updater methods do not
5563      * update the underlying database; instead the <code>updateRow</code> or
5564      * <code>insertRow</code> methods are called to update the database.
5565      *
5566      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5567      * it might be more efficient to use a version of
5568      * <code>updateAsciiStream</code> which takes a length parameter.
5569      *
5570      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
5571 bel is the name of the column
5572      * @param x the new column value
5573      * @exception SQLException if a database access error occurs,
5574      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5575      * or this method is called on a closed result set
5576      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5577      * this method
5578      * @since 1.6
5579      */
5580     public void updateAsciiStream(String columnLabel,
5581                            java.io.InputStream x) throws SQLException {
5582         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5583     }
5584 
5585 
5586     /**
5587      * Updates the designated column with a binary stream value, which will have
5588      * the specified number of bytes.
5589      * The updater methods are used to update column values in the
5590      * current row or the insert row.  The updater methods do not
5591      * update the underlying database; instead the <code>updateRow</code> or
5592      * <code>insertRow</code> methods are called to update the database.
5593      *
5594      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
5595      * @param x the new column value
5596      * @param length the length of the stream
5597      * @exception SQLException if a database access error occurs,
5598      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5599      * or this method is called on a closed result set
5600      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5601      * this method
5602      * @since 1.6
5603      */
5604     public void updateBinaryStream(String columnLabel,
5605                             java.io.InputStream x,
5606                             long length) throws SQLException {
5607         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5608     }
5609 
5610     /**
5611      * Updates the designated column with a binary stream value.
5612      * The updater methods are used to update column values in the
5613      * current row or the insert row.  The updater methods do not
5614      * update the underlying database; instead the <code>updateRow</code> or
5615      * <code>insertRow</code> methods are called to update the database.
5616      *
5617      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5618      * it might be more efficient to use a version of
5619      * <code>updateBinaryStream</code> which takes a length parameter.
5620      *
5621      * @param columnIndex the first column is 1, the second is 2, ...
5622      * @param x the new column value
5623      * @exception SQLException if a database access error occurs,
5624      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5625      * or this method is called on a closed result set
5626      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5627      * this method
5628      * @since 1.6
5629      */
5630     public void updateBinaryStream(int columnIndex,
5631                             java.io.InputStream x) throws SQLException {
5632         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5633     }
5634 
5635 
5636     /**
5637      * Updates the designated column with a binary stream value.
5638      * The updater methods are used to update column values in the
5639      * current row or the insert row.  The updater methods do not
5640      * update the underlying database; instead the <code>updateRow</code> or
5641      * <code>insertRow</code> methods are called to update the database.
5642      *
5643      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5644      * it might be more efficient to use a version of
5645      * <code>updateBinaryStream</code> which takes a length parameter.
5646      *
5647      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
5648 bel is the name of the column
5649      * @param x the new column value
5650      * @exception SQLException if a database access error occurs,
5651      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5652      * or this method is called on a closed result set
5653      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5654      * this method
5655      * @since 1.6
5656      */
5657     public void updateBinaryStream(String columnLabel,
5658                             java.io.InputStream x) throws SQLException {
5659         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5660     }
5661 
5662 
5663     /**
5664      * Updates the designated column with a character stream value, which will have
5665      * the specified number of bytes.
5666      * The updater methods are used to update column values in the
5667      * current row or the insert row.  The updater methods do not
5668      * update the underlying database; instead the <code>updateRow</code> or
5669      * <code>insertRow</code> methods are called to update the database.
5670      *
5671      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
5672      * @param reader the <code>java.io.Reader</code> object containing
5673      *        the new column value
5674      * @param length the length of the stream
5675      * @exception SQLException if a database access error occurs,
5676      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5677      * or this method is called on a closed result set
5678      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5679      * this method
5680      * @since 1.6
5681      */
5682     public void updateCharacterStream(String columnLabel,
5683                              java.io.Reader reader,
5684                              long length) throws SQLException {
5685         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5686     }
5687 
5688     /**
5689      * Updates the designated column with a character stream value.
5690      * The updater methods are used to update column values in the
5691      * current row or the insert row.  The updater methods do not
5692      * update the underlying database; instead the <code>updateRow</code> or
5693      * <code>insertRow</code> methods are called to update the database.
5694      *
5695      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5696      * it might be more efficient to use a version of
5697      * <code>updateCharacterStream</code> which takes a length parameter.
5698      *
5699      * @param columnIndex the first column is 1, the second is 2, ...
5700      * @param x the new column value
5701      * @exception SQLException if a database access error occurs,
5702      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5703      * or this method is called on a closed result set
5704      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5705      * this method
5706      * @since 1.6
5707      */
5708     public void updateCharacterStream(int columnIndex,
5709                              java.io.Reader x) throws SQLException {
5710         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5711     }
5712 
5713     /**
5714      * Updates the designated column with a character stream value.
5715      * The updater methods are used to update column values in the
5716      * current row or the insert row.  The updater methods do not
5717      * update the underlying database; instead the <code>updateRow</code> or
5718      * <code>insertRow</code> methods are called to update the database.
5719      *
5720      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5721      * it might be more efficient to use a version of
5722      * <code>updateCharacterStream</code> which takes a length parameter.
5723      *
5724      * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
5725 bel is the name of the column
5726      * @param reader the <code>java.io.Reader</code> object containing
5727      *        the new column value
5728      * @exception SQLException if a database access error occurs,
5729      * the result set concurrency is <code>CONCUR_READ_ONLY</code>
5730      * or this method is called on a closed result set
5731      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5732      * this method
5733      * @since 1.6
5734      */
5735     public void updateCharacterStream(String columnLabel,
5736                              java.io.Reader reader) throws SQLException {
5737         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5738     }
5739 
5740 
5741      /**
5742   * Sets the designated parameter to the given <code>java.net.URL</code> value.
5743   * The driver converts this to an SQL <code>DATALINK</code> value
5744   * when it sends it to the database.
5745   *
5746   * @param parameterIndex the first parameter is 1, the second is 2, ...
5747   * @param x the <code>java.net.URL</code> object to be set
5748   * @exception SQLException if a database access error occurs or
5749   * this method is called on a closed <code>PreparedStatement</code>
5750   * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
5751   * @since 1.4
5752   */
5753   public void setURL(int parameterIndex, java.net.URL x) throws SQLException{
5754         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5755    }
5756 
5757 
5758    /**
5759   * Sets the designated parameter to a <code>Reader</code> object.
5760   * This method differs from the <code>setCharacterStream (int, Reader)</code> method
5761   * because it informs the driver that the parameter value should be sent to
5762   * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
5763   * driver may have to do extra work to determine whether the parameter
5764   * data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
5765   * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5766   * it might be more efficient to use a version of
5767   * <code>setNClob</code> which takes a length parameter.
5768   *
5769   * @param parameterIndex index of the first parameter is 1, the second is 2, ...
5770   * @param reader An object that contains the data to set the parameter value to.
5771   * @throws SQLException if parameterIndex does not correspond to a parameter
5772   * marker in the SQL statement;
5773   * if the driver does not support national character sets;
5774   * if the driver can detect that a data conversion
5775   *  error could occur;  if a database access error occurs or
5776   * this method is called on a closed <code>PreparedStatement</code>
5777   * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
5778   *
5779   * @since 1.6
5780   */
5781   public void setNClob(int parameterIndex, Reader reader)
5782     throws SQLException{
5783         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5784    }
5785 
5786    /**
5787   * Sets the designated parameter to a <code>Reader</code> object.  The <code>reader</code> must contain the number
5788              * of characters specified by length otherwise a <code>SQLException</code> will be
5789             * generated when the <code>CallableStatement</code> is executed.
5790             * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
5791             * because it informs the driver that the parameter value should be sent to
5792             * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
5793             * driver may have to do extra work to determine whether the parameter
5794             * data should be send to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
5795             *
5796             * @param parameterName the name of the parameter to be set
5797             * @param reader An object that contains the data to set the parameter value to.
5798             * @param length the number of characters in the parameter data.
5799             * @throws SQLException if parameterIndex does not correspond to a parameter
5800             * marker in the SQL statement; if the length specified is less than zero;
5801             * if the driver does not support national
5802             *         character sets;  if the driver can detect that a data conversion
5803             *  error could occur; if a database access error occurs or
5804             * this method is called on a closed <code>CallableStatement</code>
5805             * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5806             * this method
5807             * @since 1.6
5808             */
5809             public void setNClob(String parameterName, Reader reader, long length)
5810     throws SQLException{
5811         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5812    }
5813 
5814 
5815  /**
5816   * Sets the designated parameter to a <code>Reader</code> object.
5817   * This method differs from the <code>setCharacterStream (int, Reader)</code> method
5818   * because it informs the driver that the parameter value should be sent to
5819   * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
5820   * driver may have to do extra work to determine whether the parameter
5821   * data should be send to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
5822   * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5823   * it might be more efficient to use a version of
5824   * <code>setNClob</code> which takes a length parameter.
5825   *
5826   * @param parameterName the name of the parameter
5827   * @param reader An object that contains the data to set the parameter value to.
5828   * @throws SQLException if the driver does not support national character sets;
5829   * if the driver can detect that a data conversion
5830   *  error could occur;  if a database access error occurs or
5831   * this method is called on a closed <code>CallableStatement</code>
5832   * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
5833   *
5834   * @since 1.6
5835   */
5836   public void setNClob(String parameterName, Reader reader)
5837     throws SQLException{
5838              throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5839    }
5840 
5841 
5842    /**
5843      ** of characters specified by length otherwise a <code>SQLException</code> will becontain  the number
5844      * generated when the <code>PreparedStatement</code> is executed.
5845      * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
5846      * because it informs the driver that the parameter value should be sent to
5847      * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
5848      * driver may have to do extra work to determine whether the parameter
5849      * data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
5850      * @param parameterIndex index of the first parameter is 1, the second is 2, ...
5851      * @param reader An object that contains the data to set the parameter value to.
5852      * @param length the number of characters in the parameter data.
5853      * @throws SQLException if parameterIndex does not correspond to a parameter
5854      * marker in the SQL statement; if the length specified is less than zero;
5855      * if the driver does not support national character sets;
5856      * if the driver can detect that a data conversion
5857      *  error could occur;  if a database access error occurs or
5858      * this method is called on a closed <code>PreparedStatement</code>
5859      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
5860      *
5861      * @since 1.6
5862      */
5863      public void setNClob(int parameterIndex, Reader reader, long length)
5864        throws SQLException{
5865         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5866    }
5867 
5868 
5869     /**
5870      * Sets the designated parameter to a <code>java.sql.NClob</code> object. The driver converts this to
5871 a
5872      * SQL <code>NCLOB</code> value when it sends it to the database.
5873      * @param parameterIndex of the first parameter is 1, the second is 2, ...
5874      * @param value the parameter value
5875      * @throws SQLException if the driver does not support national
5876      *         character sets;  if the driver can detect that a data conversion
5877      *  error could occur ; or if a database access error occurs
5878      * @since 1.6
5879      */
5880      public void setNClob(int parameterIndex, NClob value) throws SQLException{
5881         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5882    }
5883 
5884 
5885  /**
5886   * Sets the designated parameter to the given <code>String</code> object.
5887   * The driver converts this to a SQL <code>NCHAR</code> or
5888   * <code>NVARCHAR</code> or <code>LONGNVARCHAR</code>
5889   * @param parameterName the name of the column to be set
5890   * @param value the parameter value
5891   * @throws SQLException if the driver does not support national
5892   *         character sets;  if the driver can detect that a data conversion
5893   *  error could occur; or if a database access error occurs
5894   * @since 1.6
5895   */
5896  public void setNString(String parameterName, String value)
5897          throws SQLException{
5898         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5899    }
5900 
5901  /**
5902   * Sets the designated parameter to a <code>Reader</code> object. The
5903   * <code>Reader</code> reads the data till end-of-file is reached. The
5904   * driver does the necessary conversion from Java character format to
5905   * the national character set in the database.
5906   * @param parameterIndex of the first parameter is 1, the second is 2, ...
5907   * @param value the parameter value
5908   * @param length the number of characters in the parameter data.
5909   * @throws SQLException if the driver does not support national
5910   *         character sets;  if the driver can detect that a data conversion
5911   *  error could occur ; or if a database access error occurs
5912   * @since 1.6
5913   */
5914   public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException{
5915         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5916    }
5917 
5918 
5919 
5920  /**
5921   * Sets the designated parameter to a <code>Reader</code> object. The
5922   * <code>Reader</code> reads the data till end-of-file is reached. The
5923   * driver does the necessary conversion from Java character format to
5924   * the national character set in the database.
5925   * @param parameterName the name of the column to be set
5926   * @param value the parameter value
5927   * @param length the number of characters in the parameter data.
5928   * @throws SQLException if the driver does not support national
5929   *         character sets;  if the driver can detect that a data conversion
5930   *  error could occur; or if a database access error occurs
5931   * @since 1.6
5932   */
5933  public void setNCharacterStream(String parameterName, Reader value, long length)
5934          throws SQLException{
5935         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5936    }
5937 
5938   /**
5939   * Sets the designated parameter to a <code>Reader</code> object. The
5940   * <code>Reader</code> reads the data till end-of-file is reached. The
5941   * driver does the necessary conversion from Java character format to
5942   * the national character set in the database.
5943 
5944   * <P><B>Note:</B> This stream object can either be a standard
5945   * Java stream object or your own subclass that implements the
5946   * standard interface.
5947   * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
5948   * it might be more efficient to use a version of
5949   * <code>setNCharacterStream</code> which takes a length parameter.
5950   *
5951   * @param parameterName the name of the parameter
5952   * @param value the parameter value
5953   * @throws SQLException if the driver does not support national
5954   *         character sets;  if the driver can detect that a data conversion
5955   *  error could occur ; if a database access error occurs; or
5956   * this method is called on a closed <code>CallableStatement</code>
5957   * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
5958   * @since 1.6
5959   */
5960   public void setNCharacterStream(String parameterName, Reader value) throws SQLException{
5961         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5962    }
5963 
5964   /**
5965     * Sets the designated parameter to the given <code>java.sql.Timestamp</code> value,
5966     * using the given <code>Calendar</code> object.  The driver uses
5967     * the <code>Calendar</code> object to construct an SQL <code>TIMESTAMP</code> value,
5968     * which the driver then sends to the database.  With a
5969     * a <code>Calendar</code> object, the driver can calculate the timestamp
5970     * taking into account a custom timezone.  If no
5971     * <code>Calendar</code> object is specified, the driver uses the default
5972     * timezone, which is that of the virtual machine running the application.
5973     *
5974     * @param parameterName the name of the parameter
5975     * @param x the parameter value
5976     * @param cal the <code>Calendar</code> object the driver will use
5977     *            to construct the timestamp
5978     * @exception SQLException if a database access error occurs or
5979     * this method is called on a closed <code>CallableStatement</code>
5980     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
5981     * this method
5982     * @see #getTimestamp
5983     * @since 1.4
5984     */
5985     public void setTimestamp(String parameterName, java.sql.Timestamp x, Calendar cal)
5986        throws SQLException{
5987         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
5988    }
5989 
5990     /**
5991     * Sets the designated parameter to a <code>Reader</code> object.  The <code>reader</code> must contain  the number
5992                * of characters specified by length otherwise a <code>SQLException</code> will be
5993                * generated when the <code>CallableStatement</code> is executed.
5994               * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
5995               * because it informs the driver that the parameter value should be sent to
5996               * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
5997                * driver may have to do extra work to determine whether the parameter
5998                * data should be send to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
5999                * @param parameterName the name of the parameter to be set
6000               * @param reader An object that contains the data to set the parameter value to.
6001               * @param length the number of characters in the parameter data.
6002               * @throws SQLException if parameterIndex does not correspond to a parameter
6003               * marker in the SQL statement; if the length specified is less than zero;
6004               * a database access error occurs or
6005               * this method is called on a closed <code>CallableStatement</code>
6006               * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6007               * this method
6008               *
6009               * @since 1.6
6010               */
6011       public  void setClob(String parameterName, Reader reader, long length)
6012       throws SQLException{
6013         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6014    }
6015 
6016 
6017 
6018   /**
6019     * Sets the designated parameter to the given <code>java.sql.Clob</code> object.
6020     * The driver converts this to an SQL <code>CLOB</code> value when it
6021     * sends it to the database.
6022     *
6023     * @param parameterName the name of the parameter
6024     * @param x a <code>Clob</code> object that maps an SQL <code>CLOB</code> value
6025     * @exception SQLException if a database access error occurs or
6026     * this method is called on a closed <code>CallableStatement</code>
6027     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6028     * this method
6029     * @since 1.6
6030     */
6031     public void setClob (String parameterName, Clob x) throws SQLException{
6032         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6033    }
6034 
6035  /**
6036     * Sets the designated parameter to a <code>Reader</code> object.
6037     * This method differs from the <code>setCharacterStream (int, Reader)</code> method
6038     * because it informs the driver that the parameter value should be sent to
6039     * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
6040     * driver may have to do extra work to determine whether the parameter
6041     * data should be send to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
6042     *
6043     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
6044     * it might be more efficient to use a version of
6045     * <code>setClob</code> which takes a length parameter.
6046     *
6047     * @param parameterName the name of the parameter
6048     * @param reader An object that contains the data to set the parameter value to.
6049     * @throws SQLException if a database access error occurs or this method is called on
6050     * a closed <code>CallableStatement</code>
6051     *
6052     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6053     * @since 1.6
6054     */
6055     public void setClob(String parameterName, Reader reader)
6056       throws SQLException{
6057         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6058    }
6059 
6060 
6061  /**
6062     * Sets the designated parameter to the given <code>java.sql.Date</code> value
6063     * using the default time zone of the virtual machine that is running
6064     * the application.
6065     * The driver converts this
6066     * to an SQL <code>DATE</code> value when it sends it to the database.
6067     *
6068     * @param parameterName the name of the parameter
6069     * @param x the parameter value
6070     * @exception SQLException if a database access error occurs or
6071     * this method is called on a closed <code>CallableStatement</code>
6072     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6073     * this method
6074     * @see #getDate
6075     * @since 1.4
6076     */
6077     public void setDate(String parameterName, java.sql.Date x)
6078        throws SQLException{
6079         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6080    }
6081 
6082    /**
6083     * Sets the designated parameter to the given <code>java.sql.Date</code> value,
6084     * using the given <code>Calendar</code> object.  The driver uses
6085     * the <code>Calendar</code> object to construct an SQL <code>DATE</code> value,
6086     * which the driver then sends to the database.  With a
6087     * a <code>Calendar</code> object, the driver can calculate the date
6088     * taking into account a custom timezone.  If no
6089     * <code>Calendar</code> object is specified, the driver uses the default
6090     * timezone, which is that of the virtual machine running the application.
6091     *
6092     * @param parameterName the name of the parameter
6093     * @param x the parameter value
6094     * @param cal the <code>Calendar</code> object the driver will use
6095     *            to construct the date
6096     * @exception SQLException if a database access error occurs or
6097     * this method is called on a closed <code>CallableStatement</code>
6098     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6099     * this method
6100     * @see #getDate
6101     * @since 1.4
6102     */
6103    public void setDate(String parameterName, java.sql.Date x, Calendar cal)
6104        throws SQLException{
6105         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6106    }
6107 
6108 
6109  /**
6110     * Sets the designated parameter to the given <code>java.sql.Time</code> value.
6111     * The driver converts this
6112     * to an SQL <code>TIME</code> value when it sends it to the database.
6113     *
6114     * @param parameterName the name of the parameter
6115     * @param x the parameter value
6116     * @exception SQLException if a database access error occurs or
6117     * this method is called on a closed <code>CallableStatement</code>
6118     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6119     * this method
6120     * @see #getTime
6121     * @since 1.4
6122     */
6123    public void setTime(String parameterName, java.sql.Time x)
6124        throws SQLException{
6125         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6126    }
6127 
6128  /**
6129     * Sets the designated parameter to the given <code>java.sql.Time</code> value,
6130     * using the given <code>Calendar</code> object.  The driver uses
6131     * the <code>Calendar</code> object to construct an SQL <code>TIME</code> value,
6132     * which the driver then sends to the database.  With a
6133     * a <code>Calendar</code> object, the driver can calculate the time
6134     * taking into account a custom timezone.  If no
6135     * <code>Calendar</code> object is specified, the driver uses the default
6136     * timezone, which is that of the virtual machine running the application.
6137     *
6138     * @param parameterName the name of the parameter
6139     * @param x the parameter value
6140     * @param cal the <code>Calendar</code> object the driver will use
6141     *            to construct the time
6142     * @exception SQLException if a database access error occurs or
6143     * this method is called on a closed <code>CallableStatement</code>
6144     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6145     * this method
6146     * @see #getTime
6147     * @since 1.4
6148     */
6149    public void setTime(String parameterName, java.sql.Time x, Calendar cal)
6150        throws SQLException{
6151         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6152    }
6153 
6154    /**
6155    * Sets the designated parameter to a <code>Reader</code> object.
6156    * This method differs from the <code>setCharacterStream (int, Reader)</code> method
6157    * because it informs the driver that the parameter value should be sent to
6158    * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
6159    * driver may have to do extra work to determine whether the parameter
6160    * data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
6161    *
6162    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
6163    * it might be more efficient to use a version of
6164    * <code>setClob</code> which takes a length parameter.
6165    *
6166    * @param parameterIndex index of the first parameter is 1, the second is 2, ...
6167    * @param reader An object that contains the data to set the parameter value to.
6168    * @throws SQLException if a database access error occurs, this method is called on
6169    * a closed <code>PreparedStatement</code>or if parameterIndex does not correspond to a parameter
6170    * marker in the SQL statement
6171    *
6172    * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6173    * @since 1.6
6174    */
6175    public void setClob(int parameterIndex, Reader reader)
6176      throws SQLException{
6177         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6178    }
6179 
6180 
6181    /**
6182    * Sets the designated parameter to a <code>Reader</code> object.  The reader must contain  the number
6183    * of characters specified by length otherwise a <code>SQLException</code> will be
6184    * generated when the <code>PreparedStatement</code> is executed.
6185    *This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
6186    * because it informs the driver that the parameter value should be sent to
6187    * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
6188    * driver may have to do extra work to determine whether the parameter
6189    * data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
6190    * @param parameterIndex index of the first parameter is 1, the second is 2, ...
6191    * @param reader An object that contains the data to set the parameter value to.
6192    * @param length the number of characters in the parameter data.
6193    * @throws SQLException if a database access error occurs, this method is called on
6194    * a closed <code>PreparedStatement</code>, if parameterIndex does not correspond to a parameter
6195    * marker in the SQL statement, or if the length specified is less than zero.
6196    *
6197    * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6198    * @since 1.6
6199    */
6200    public void setClob(int parameterIndex, Reader reader, long length)
6201      throws SQLException{
6202         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6203    }
6204 
6205 
6206  /**
6207     * Sets the designated parameter to a <code>InputStream</code> object.  The inputstream must contain  the number
6208     * of characters specified by length otherwise a <code>SQLException</code> will be
6209     * generated when the <code>PreparedStatement</code> is executed.
6210     * This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
6211     * method because it informs the driver that the parameter value should be
6212     * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
6213     * the driver may have to do extra work to determine whether the parameter
6214     * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
6215     * @param parameterIndex index of the first parameter is 1,
6216     * the second is 2, ...
6217     * @param inputStream An object that contains the data to set the parameter
6218     * value to.
6219     * @param length the number of bytes in the parameter data.
6220     * @throws SQLException if a database access error occurs,
6221     * this method is called on a closed <code>PreparedStatement</code>,
6222     * if parameterIndex does not correspond
6223     * to a parameter marker in the SQL statement,  if the length specified
6224     * is less than zero or if the number of bytes in the inputstream does not match
6225     * the specified length.
6226     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6227     *
6228     * @since 1.6
6229     */
6230     public void setBlob(int parameterIndex, InputStream inputStream, long length)
6231        throws SQLException{
6232         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6233    }
6234 
6235  /**
6236     * Sets the designated parameter to a <code>InputStream</code> object.
6237     * This method differs from the <code>setBinaryStream (int, InputStream)</code>
6238     * This method differs from the <code>setBinaryStream (int, InputStream)</code>
6239     * method because it informs the driver that the parameter value should be
6240     * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
6241     * the driver may have to do extra work to determine whether the parameter
6242     * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
6243     *
6244     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
6245     * it might be more efficient to use a version of
6246     * <code>setBlob</code> which takes a length parameter.
6247     *
6248     * @param parameterIndex index of the first parameter is 1,
6249     * the second is 2, ...
6250 
6251 
6252     * @param inputStream An object that contains the data to set the parameter
6253     * value to.
6254     * @throws SQLException if a database access error occurs,
6255     * this method is called on a closed <code>PreparedStatement</code> or
6256     * if parameterIndex does not correspond
6257     * to a parameter marker in the SQL statement,
6258     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6259     *
6260     * @since 1.6
6261     */
6262     public void setBlob(int parameterIndex, InputStream inputStream)
6263        throws SQLException{
6264         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6265    }
6266 
6267  /**
6268     * Sets the designated parameter to a <code>InputStream</code> object.  The <code>inputstream</code> must contain  the number
6269       * of characters specified by length, otherwise a <code>SQLException</code> will be
6270       * generated when the <code>CallableStatement</code> is executed.
6271       * This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
6272       * method because it informs the driver that the parameter value should be
6273       * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
6274       * the driver may have to do extra work to determine whether the parameter
6275       * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
6276       *
6277       * @param parameterName the name of the parameter to be set
6278       * the second is 2, ...
6279       *
6280       * @param inputStream An object that contains the data to set the parameter
6281       * value to.
6282       * @param length the number of bytes in the parameter data.
6283       * @throws SQLException  if parameterIndex does not correspond
6284       * to a parameter marker in the SQL statement,  or if the length specified
6285       * is less than zero; if the number of bytes in the inputstream does not match
6286       * the specified length; if a database access error occurs or
6287       * this method is called on a closed <code>CallableStatement</code>
6288       * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6289       * this method
6290       *
6291       * @since 1.6
6292       */
6293       public void setBlob(String parameterName, InputStream inputStream, long length)
6294          throws SQLException{
6295          throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6296     }
6297 
6298 
6299  /**
6300     * Sets the designated parameter to the given <code>java.sql.Blob</code> object.
6301     * The driver converts this to an SQL <code>BLOB</code> value when it
6302     * sends it to the database.
6303     *
6304     * @param parameterName the name of the parameter
6305     * @param x a <code>Blob</code> object that maps an SQL <code>BLOB</code> value
6306     * @exception SQLException if a database access error occurs or
6307     * this method is called on a closed <code>CallableStatement</code>
6308     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6309     * this method
6310     * @since 1.6
6311     */
6312    public void setBlob (String parameterName, Blob x) throws SQLException{
6313         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6314    }
6315 
6316  /**
6317     * Sets the designated parameter to a <code>InputStream</code> object.
6318     * This method differs from the <code>setBinaryStream (int, InputStream)</code>
6319     * method because it informs the driver that the parameter value should be
6320     * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
6321     * the driver may have to do extra work to determine whether the parameter
6322     * data should be send to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
6323     *
6324     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
6325     * it might be more efficient to use a version of
6326     * <code>setBlob</code> which takes a length parameter.
6327     *
6328     * @param parameterName the name of the parameter
6329     * @param inputStream An object that contains the data to set the parameter
6330     * value to.
6331     * @throws SQLException if a database access error occurs or
6332     * this method is called on a closed <code>CallableStatement</code>
6333     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6334     *
6335     * @since 1.6
6336     */
6337     public void setBlob(String parameterName, InputStream inputStream)
6338        throws SQLException{
6339         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6340    }
6341 
6342   /**
6343   * Sets the value of the designated parameter with the given object. The second
6344   * argument must be an object type; for integral values, the
6345   * <code>java.lang</code> equivalent objects should be used.
6346   *
6347   * <p>The given Java object will be converted to the given targetSqlType
6348   * before being sent to the database.
6349   *
6350   * If the object has a custom mapping (is of a class implementing the
6351   * interface <code>SQLData</code>),
6352   * the JDBC driver should call the method <code>SQLData.writeSQL</code> to write it
6353   * to the SQL data stream.
6354   * If, on the other hand, the object is of a class implementing
6355   * <code>Ref</code>, <code>Blob</code>, <code>Clob</code>,  <code>NClob</code>,
6356   *  <code>Struct</code>, <code>java.net.URL</code>,
6357   * or <code>Array</code>, the driver should pass it to the database as a
6358   * value of the corresponding SQL type.
6359   * <P>
6360   * Note that this method may be used to pass datatabase-
6361   * specific abstract data types.
6362   *
6363   * @param parameterName the name of the parameter
6364   * @param x the object containing the input parameter value
6365   * @param targetSqlType the SQL type (as defined in java.sql.Types) to be
6366   * sent to the database. The scale argument may further qualify this type.
6367   * @param scale for java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types,
6368   *          this is the number of digits after the decimal point.  For all other
6369   *          types, this value will be ignored.
6370   * @exception SQLException if a database access error occurs or
6371   * this method is called on a closed <code>CallableStatement</code>
6372   * @exception SQLFeatureNotSupportedException if <code>targetSqlType</code> is
6373   * a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
6374   * <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
6375   * <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
6376   *  <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
6377   * or  <code>STRUCT</code> data type and the JDBC driver does not support
6378   * this data type
6379   * @see Types
6380   * @see #getObject
6381   * @since 1.4
6382   */
6383   public void setObject(String parameterName, Object x, int targetSqlType, int scale)
6384      throws SQLException{
6385       throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6386  }
6387 
6388   /**
6389     * Sets the value of the designated parameter with the given object.
6390     * This method is like the method <code>setObject</code>
6391     * above, except that it assumes a scale of zero.
6392     *
6393     * @param parameterName the name of the parameter
6394     * @param x the object containing the input parameter value
6395     * @param targetSqlType the SQL type (as defined in java.sql.Types) to be
6396     *                      sent to the database
6397     * @exception SQLException if a database access error occurs or
6398     * this method is called on a closed <code>CallableStatement</code>
6399     * @exception SQLFeatureNotSupportedException if <code>targetSqlType</code> is
6400     * a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
6401     * <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
6402     * <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
6403     *  <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
6404     * or  <code>STRUCT</code> data type and the JDBC driver does not support
6405     * this data type
6406     * @see #getObject
6407     * @since 1.4
6408     */
6409     public void setObject(String parameterName, Object x, int targetSqlType)
6410        throws SQLException{
6411         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6412    }
6413 
6414  /**
6415    * Sets the value of the designated parameter with the given object.
6416    * The second parameter must be of type <code>Object</code>; therefore, the
6417    * <code>java.lang</code> equivalent objects should be used for built-in types.
6418    *
6419    * <p>The JDBC specification specifies a standard mapping from
6420    * Java <code>Object</code> types to SQL types.  The given argument
6421    * will be converted to the corresponding SQL type before being
6422    * sent to the database.
6423    *
6424    * <p>Note that this method may be used to pass datatabase-
6425    * specific abstract data types, by using a driver-specific Java
6426    * type.
6427    *
6428    * If the object is of a class implementing the interface <code>SQLData</code>,
6429    * the JDBC driver should call the method <code>SQLData.writeSQL</code>
6430    * to write it to the SQL data stream.
6431    * If, on the other hand, the object is of a class implementing
6432    * <code>Ref</code>, <code>Blob</code>, <code>Clob</code>,  <code>NClob</code>,
6433    *  <code>Struct</code>, <code>java.net.URL</code>,
6434    * or <code>Array</code>, the driver should pass it to the database as a
6435    * value of the corresponding SQL type.
6436    * <P>
6437    * This method throws an exception if there is an ambiguity, for example, if the
6438    * object is of a class implementing more than one of the interfaces named above.
6439    *
6440    * @param parameterName the name of the parameter
6441    * @param x the object containing the input parameter value
6442    * @exception SQLException if a database access error occurs,
6443    * this method is called on a closed <code>CallableStatement</code> or if the given
6444    *            <code>Object</code> parameter is ambiguous
6445    * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6446    * this method
6447    * @see #getObject
6448    * @since 1.4
6449    */
6450    public void setObject(String parameterName, Object x) throws SQLException{
6451         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6452    }
6453 
6454   /**
6455   * Sets the designated parameter to the given input stream, which will have
6456   * the specified number of bytes.
6457   * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
6458   * parameter, it may be more practical to send it via a
6459   * <code>java.io.InputStream</code>. Data will be read from the stream
6460   * as needed until end-of-file is reached.  The JDBC driver will
6461   * do any necessary conversion from ASCII to the database char format.
6462   *
6463   * <P><B>Note:</B> This stream object can either be a standard
6464   * Java stream object or your own subclass that implements the
6465   * standard interface.
6466   *
6467   * @param parameterName the name of the parameter
6468   * @param x the Java input stream that contains the ASCII parameter value
6469   * @param length the number of bytes in the stream
6470   * @exception SQLException if a database access error occurs or
6471   * this method is called on a closed <code>CallableStatement</code>
6472   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6473   * this method
6474   * @since 1.4
6475   */
6476  public void setAsciiStream(String parameterName, java.io.InputStream x, int length)
6477      throws SQLException{
6478       throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6479  }
6480 
6481 
6482 /**
6483   * Sets the designated parameter to the given input stream, which will have
6484   * the specified number of bytes.
6485   * When a very large binary value is input to a <code>LONGVARBINARY</code>
6486   * parameter, it may be more practical to send it via a
6487   * <code>java.io.InputStream</code> object. The data will be read from the stream
6488   * as needed until end-of-file is reached.
6489   *
6490   * <P><B>Note:</B> This stream object can either be a standard
6491   * Java stream object or your own subclass that implements the
6492   * standard interface.
6493   *
6494   * @param parameterName the name of the parameter
6495   * @param x the java input stream which contains the binary parameter value
6496   * @param length the number of bytes in the stream
6497   * @exception SQLException if a database access error occurs or
6498   * this method is called on a closed <code>CallableStatement</code>
6499   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6500   * this method
6501   * @since 1.4
6502   */
6503  public void setBinaryStream(String parameterName, java.io.InputStream x,
6504                       int length) throws SQLException{
6505       throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6506  }
6507 
6508  /**
6509    * Sets the designated parameter to the given <code>Reader</code>
6510    * object, which is the given number of characters long.
6511    * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
6512    * parameter, it may be more practical to send it via a
6513    * <code>java.io.Reader</code> object. The data will be read from the stream
6514    * as needed until end-of-file is reached.  The JDBC driver will
6515    * do any necessary conversion from UNICODE to the database char format.
6516    *
6517    * <P><B>Note:</B> This stream object can either be a standard
6518    * Java stream object or your own subclass that implements the
6519    * standard interface.
6520    *
6521    * @param parameterName the name of the parameter
6522    * @param reader the <code>java.io.Reader</code> object that
6523    *        contains the UNICODE data used as the designated parameter
6524    * @param length the number of characters in the stream
6525    * @exception SQLException if a database access error occurs or
6526    * this method is called on a closed <code>CallableStatement</code>
6527    * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6528    * this method
6529    * @since 1.4
6530    */
6531   public void setCharacterStream(String parameterName,
6532                           java.io.Reader reader,
6533                           int length) throws SQLException{
6534        throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6535   }
6536 
6537   /**
6538    * Sets the designated parameter to the given input stream.
6539    * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
6540    * parameter, it may be more practical to send it via a
6541    * <code>java.io.InputStream</code>. Data will be read from the stream
6542    * as needed until end-of-file is reached.  The JDBC driver will
6543    * do any necessary conversion from ASCII to the database char format.
6544    *
6545    * <P><B>Note:</B> This stream object can either be a standard
6546    * Java stream object or your own subclass that implements the
6547    * standard interface.
6548    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
6549    * it might be more efficient to use a version of
6550    * <code>setAsciiStream</code> which takes a length parameter.
6551    *
6552    * @param parameterName the name of the parameter
6553    * @param x the Java input stream that contains the ASCII parameter value
6554    * @exception SQLException if a database access error occurs or
6555    * this method is called on a closed <code>CallableStatement</code>
6556    * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6557      * @since 1.6
6558   */
6559   public void setAsciiStream(String parameterName, java.io.InputStream x)
6560           throws SQLException{
6561         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6562    }
6563 
6564 
6565  /**
6566     * Sets the designated parameter to the given input stream.
6567     * When a very large binary value is input to a <code>LONGVARBINARY</code>
6568     * parameter, it may be more practical to send it via a
6569     * <code>java.io.InputStream</code> object. The data will be read from the
6570     * stream as needed until end-of-file is reached.
6571     *
6572     * <P><B>Note:</B> This stream object can either be a standard
6573     * Java stream object or your own subclass that implements the
6574     * standard interface.
6575     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
6576     * it might be more efficient to use a version of
6577     * <code>setBinaryStream</code> which takes a length parameter.
6578     *
6579     * @param parameterName the name of the parameter
6580     * @param x the java input stream which contains the binary parameter value
6581     * @exception SQLException if a database access error occurs or
6582     * this method is called on a closed <code>CallableStatement</code>
6583     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6584     * @since 1.6
6585     */
6586    public void setBinaryStream(String parameterName, java.io.InputStream x)
6587    throws SQLException{
6588         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6589    }
6590 
6591  /**
6592     * Sets the designated parameter to the given <code>Reader</code>
6593     * object.
6594     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
6595     * parameter, it may be more practical to send it via a
6596     * <code>java.io.Reader</code> object. The data will be read from the stream
6597     * as needed until end-of-file is reached.  The JDBC driver will
6598     * do any necessary conversion from UNICODE to the database char format.
6599     *
6600     * <P><B>Note:</B> This stream object can either be a standard
6601     * Java stream object or your own subclass that implements the
6602     * standard interface.
6603     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
6604     * it might be more efficient to use a version of
6605     * <code>setCharacterStream</code> which takes a length parameter.
6606     *
6607     * @param parameterName the name of the parameter
6608     * @param reader the <code>java.io.Reader</code> object that contains the
6609     *        Unicode data
6610     * @exception SQLException if a database access error occurs or
6611     * this method is called on a closed <code>CallableStatement</code>
6612     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
6613     * @since 1.6
6614     */
6615    public void setCharacterStream(String parameterName,
6616                          java.io.Reader reader) throws SQLException{
6617         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6618    }
6619 
6620    /**
6621     * Sets the designated parameter to the given
6622     * <code>java.math.BigDecimal</code> value.
6623     * The driver converts this to an SQL <code>NUMERIC</code> value when
6624     * it sends it to the database.
6625     *
6626     * @param parameterName the name of the parameter
6627     * @param x the parameter value
6628     * @exception SQLException if a database access error occurs or
6629     * this method is called on a closed <code>CallableStatement</code>
6630     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6631     * this method
6632     * @see #getBigDecimal
6633     * @since 1.4
6634     */
6635    public void setBigDecimal(String parameterName, BigDecimal x) throws SQLException{
6636         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6637    }
6638 
6639  /**
6640     * Sets the designated parameter to the given Java <code>String</code> value.
6641     * The driver converts this
6642     * to an SQL <code>VARCHAR</code> or <code>LONGVARCHAR</code> value
6643     * (depending on the argument's
6644     * size relative to the driver's limits on <code>VARCHAR</code> values)
6645     * when it sends it to the database.
6646     *
6647     * @param parameterName the name of the parameter
6648     * @param x the parameter value
6649     * @exception SQLException if a database access error occurs or
6650     * this method is called on a closed <code>CallableStatement</code>
6651     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6652     * this method
6653     * @see #getString
6654     * @since 1.4
6655     */
6656    public void setString(String parameterName, String x) throws SQLException{
6657         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6658    }
6659 
6660 
6661 
6662  /**
6663     * Sets the designated parameter to the given Java array of bytes.
6664     * The driver converts this to an SQL <code>VARBINARY</code> or
6665     * <code>LONGVARBINARY</code> (depending on the argument's size relative
6666     * to the driver's limits on <code>VARBINARY</code> values) when it sends
6667     * it to the database.
6668     *
6669     * @param parameterName the name of the parameter
6670     * @param x the parameter value
6671     * @exception SQLException if a database access error occurs or
6672     * this method is called on a closed <code>CallableStatement</code>
6673     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6674     * this method
6675     * @see #getBytes
6676     * @since 1.4
6677     */
6678    public void setBytes(String parameterName, byte x[]) throws SQLException{
6679         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6680    }
6681 
6682  /**
6683     * Sets the designated parameter to the given <code>java.sql.Timestamp</code> value.
6684     * The driver
6685     * converts this to an SQL <code>TIMESTAMP</code> value when it sends it to the
6686     * database.
6687     *
6688     * @param parameterName the name of the parameter
6689     * @param x the parameter value
6690     * @exception SQLException if a database access error occurs or
6691     * this method is called on a closed <code>CallableStatement</code>
6692     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6693     * this method
6694     * @see #getTimestamp
6695     * @since 1.4
6696     */
6697    public void setTimestamp(String parameterName, java.sql.Timestamp x)
6698        throws SQLException{
6699         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6700    }
6701 
6702     /**
6703     * Sets the designated parameter to SQL <code>NULL</code>.
6704     *
6705     * <P><B>Note:</B> You must specify the parameter's SQL type.
6706     *
6707     * @param parameterName the name of the parameter
6708     * @param sqlType the SQL type code defined in <code>java.sql.Types</code>
6709     * @exception SQLException if a database access error occurs or
6710     * this method is called on a closed <code>CallableStatement</code>
6711     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6712     * this method
6713     * @since 1.4
6714     */
6715    public void setNull(String parameterName, int sqlType) throws SQLException {
6716         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6717    }
6718 
6719  /**
6720     * Sets the designated parameter to SQL <code>NULL</code>.
6721     * This version of the method <code>setNull</code> should
6722     * be used for user-defined types and REF type parameters.  Examples
6723     * of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and
6724     * named array types.
6725     *
6726     * <P><B>Note:</B> To be portable, applications must give the
6727     * SQL type code and the fully-qualified SQL type name when specifying
6728     * a NULL user-defined or REF parameter.  In the case of a user-defined type
6729     * the name is the type name of the parameter itself.  For a REF
6730     * parameter, the name is the type name of the referenced type.  If
6731     * a JDBC driver does not need the type code or type name information,
6732     * it may ignore it.
6733     *
6734     * Although it is intended for user-defined and Ref parameters,
6735     * this method may be used to set a null parameter of any JDBC type.
6736     * If the parameter does not have a user-defined or REF type, the given
6737     * typeName is ignored.
6738     *
6739     *
6740     * @param parameterName the name of the parameter
6741     * @param sqlType a value from <code>java.sql.Types</code>
6742     * @param typeName the fully-qualified name of an SQL user-defined type;
6743     *        ignored if the parameter is not a user-defined type or
6744     *        SQL <code>REF</code> value
6745     * @exception SQLException if a database access error occurs or
6746     * this method is called on a closed <code>CallableStatement</code>
6747     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6748     * this method
6749     * @since 1.4
6750     */
6751    public void setNull (String parameterName, int sqlType, String typeName)
6752        throws SQLException{
6753         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6754    }
6755 
6756  /**
6757     * Sets the designated parameter to the given Java <code>boolean</code> value.
6758     * The driver converts this
6759     * to an SQL <code>BIT</code> or <code>BOOLEAN</code> value when it sends it to the database.
6760     *
6761     * @param parameterName the name of the parameter
6762     * @param x the parameter value
6763     * @exception SQLException if a database access error occurs or
6764     * this method is called on a closed <code>CallableStatement</code>
6765     * @see #getBoolean
6766     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6767     * this method
6768     * @since 1.4
6769     */
6770    public void setBoolean(String parameterName, boolean x) throws SQLException{
6771         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6772    }
6773 
6774 
6775 
6776  /**
6777     * Sets the designated parameter to the given Java <code>byte</code> value.
6778     * The driver converts this
6779     * to an SQL <code>TINYINT</code> value when it sends it to the database.
6780     *
6781     * @param parameterName the name of the parameter
6782     * @param x the parameter value
6783     * @exception SQLException if a database access error occurs or
6784     * this method is called on a closed <code>CallableStatement</code>
6785     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6786     * this method
6787     * @see #getByte
6788     * @since 1.4
6789     */
6790    public void setByte(String parameterName, byte x) throws SQLException{
6791         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6792    }
6793 
6794 
6795  /**
6796     * Sets the designated parameter to the given Java <code>short</code> value.
6797     * The driver converts this
6798     * to an SQL <code>SMALLINT</code> value when it sends it to the database.
6799     *
6800     * @param parameterName the name of the parameter
6801     * @param x the parameter value
6802     * @exception SQLException if a database access error occurs or
6803     * this method is called on a closed <code>CallableStatement</code>
6804     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6805     * this method
6806     * @see #getShort
6807     * @since 1.4
6808     */
6809    public void setShort(String parameterName, short x) throws SQLException{
6810         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6811    }
6812 
6813 
6814    /**
6815     * Sets the designated parameter to the given Java <code>int</code> value.
6816     * The driver converts this
6817     * to an SQL <code>INTEGER</code> value when it sends it to the database.
6818     *
6819     * @param parameterName the name of the parameter
6820     * @param x the parameter value
6821     * @exception SQLException if a database access error occurs or
6822     * this method is called on a closed <code>CallableStatement</code>
6823     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6824     * this method
6825     * @see #getInt
6826     * @since 1.4
6827     */
6828    public void setInt(String parameterName, int x) throws SQLException{
6829         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6830    }
6831 
6832  /**
6833     * Sets the designated parameter to the given Java <code>long</code> value.
6834     * The driver converts this
6835     * to an SQL <code>BIGINT</code> value when it sends it to the database.
6836     *
6837     * @param parameterName the name of the parameter
6838     * @param x the parameter value
6839     * @exception SQLException if a database access error occurs or
6840     * this method is called on a closed <code>CallableStatement</code>
6841     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6842     * this method
6843     * @see #getLong
6844     * @since 1.4
6845     */
6846    public void setLong(String parameterName, long x) throws SQLException{
6847         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6848    }
6849 
6850 
6851  /**
6852     * Sets the designated parameter to the given Java <code>float</code> value.
6853     * The driver converts this
6854     * to an SQL <code>FLOAT</code> value when it sends it to the database.
6855     *
6856     * @param parameterName the name of the parameter
6857     * @param x the parameter value
6858     * @exception SQLException if a database access error occurs or
6859     * this method is called on a closed <code>CallableStatement</code>
6860     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6861     * this method
6862     * @see #getFloat
6863     * @since 1.4
6864     */
6865    public void setFloat(String parameterName, float x) throws SQLException{
6866         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6867    }
6868 
6869  /**
6870     * Sets the designated parameter to the given Java <code>double</code> value.
6871     * The driver converts this
6872     * to an SQL <code>DOUBLE</code> value when it sends it to the database.
6873     *
6874     * @param parameterName the name of the parameter
6875     * @param x the parameter value
6876     * @exception SQLException if a database access error occurs or
6877     * this method is called on a closed <code>CallableStatement</code>
6878     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
6879     * this method
6880     * @see #getDouble
6881     * @since 1.4
6882     */
6883    public void setDouble(String parameterName, double x) throws SQLException{
6884         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
6885    }
6886 
6887     /**
6888      * This method re populates the resBundle
6889      * during the deserialization process
6890      *
6891      */
6892     private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
6893         // Default state initialization happens here
6894         ois.defaultReadObject();
6895         // Initialization of transient Res Bundle happens here .
6896         try {
6897            resBundle = JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle();
6898         } catch(IOException ioe) {}
6899 
6900     }
6901 
6902    static final long serialVersionUID = -3591946023893483003L;
6903 
6904  //------------------------- JDBC 4.1 -----------------------------------
6905 
6906     public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
6907         throw new SQLFeatureNotSupportedException("Not supported yet.");
6908     }
6909 
6910     public <T> T getObject(String columnLabel, Class<T> type) throws SQLException {
6911         throw new SQLFeatureNotSupportedException("Not supported yet.");
6912     }
6913 }