ResultSet: Exception: set type is TYPE_FORWARD_ONLY — why?

后端 未结 9 1345
春和景丽
春和景丽 2020-12-15 07:08

I have very simple code:

pstat=con.prepareStatement(\"select typeid from users where username=? and password=?\");             
pstat.setString(1, username);         


        
相关标签:
9条回答
  • 2020-12-15 07:22

    The Java 8 documentation states the following:

    A default ResultSet object is not updatable and has a cursor that moves forward only. Thus, you can iterate through it only once and only from the first row to the last row. It is possible to produce ResultSet objects that are scrollable and/or updatable. The following code fragment, in which con is a valid Connection object, illustrates how to make a result set that is scrollable and insensitive to updates by others, and that is updatable. See ResultSet fields for other options.

       Statement stmt = con.createStatement(
                                      ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
       ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
       // rs will be scrollable, will not show changes made by others,
       // and will be updatable
    
    0 讨论(0)
  • 2020-12-15 07:23

    the rowCount variable is not necessary . you are performing two loops on the rs . only the second loop is necessary to get the number of rows which is done by this part of code:

     while (rs.next()){
     typeID=rs.getInt(1); //typeID is the number of rows in the ResultSet
    }
    
    0 讨论(0)
  • 2020-12-15 07:25

    Change your first statement to this

    pstat=con.prepareStatement("select typeid from users where username=? and password=?",
                                ResultSet.TYPE_SCROLL_SENSITIVE, 
                            ResultSet.CONCUR_UPDATABLE);
    

    This way you can move forward and backward, so less things to worry about

    0 讨论(0)
  • 2020-12-15 07:30

    Though this question is old, answers do not age, encountered a similar problem today, this is how I approached it, as here This is the functionality provided by Java JDBC driver, and PostgreSQL database. This case create a Statement object using the default parameters, the system-generated data sets can only be a one-way move the pointer forward, and not two-way mobile data record pointer, the former

    Statement stmt = dbConn.createStatement ();
    Result rs = stmt.executeQuery (sql);

    Changed to
    Statement stmt = dbConn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    Result rs = stmt.executeQuery (sql);

    Generated at this time rs can use rs.first () reverse move the pointer operation

    0 讨论(0)
  • 2020-12-15 07:37

    The type TYPE_FORWARD_ONLY means you can only move forward on the result set, not backward, so you get an exception when you try to go back with beforeFirst(). Instead you can either use the following prepareStatement(), which receives the resultset type as a parameter, or to do:

            pstat=con.prepareStatement("select typeid from users where username=? and password=?");             
            pstat.setString(1, username);
            pstat.setString(2, password);
            rs=pstat.executeQuery();
            int rowCount=0;
    
            while(rs.next())
            {
                rowCount++;
                typeID=rs.getInt(1);
            }
    
    0 讨论(0)
  • 2020-12-15 07:39

    java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY

    with JDBC 2.0 API, the user has the flexibility to move the cursor either forward or backward.

    Your error can be removed by creating the statemnt as follows

    Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    

    Also, a better way to count the number of rows would be

    rs=pstat.executeQuery();                //execute the query
    rs.last();                              //move the cursor to the last row
    int numberOfRows = rs.getRow();         //get the number of rows
    rs.beforeFirst();                       //back to initial state
    
    0 讨论(0)
提交回复
热议问题