Java ResultSet: Exception: set type is TYPE_FORWARD_ONLY -- 为什么?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6367737/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-16 05:23:48  来源:igfitidea点击:

ResultSet: Exception: set type is TYPE_FORWARD_ONLY -- why?

javasqlresultsetjdbc-odbc

提问by sAaNu

I have very simple code:

我有非常简单的代码:

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++;         
}
rs.beforeFirst();
if(rowCount>=1)
{
while(rs.next())
{
    typeID=rs.getInt(1);
}

But when execute this code I am getting...

但是当执行这段代码时,我得到了......

java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY
at sun.jdbc.odbc.JdbcOdbcResultSet.beforeFirst(Unknown Source)
at server.ClientImpl.login(ClientImpl.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

What is causing this and how can I fix it?

这是什么原因造成的,我该如何解决?

回答by MByD

The type TYPE_FORWARD_ONLYmeans 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:

该类型TYPE_FORWARD_ONLY意味着你只能向前的结果集,而不是落后,所以当您尝试回去跟得到一个异常beforeFirst()。相反,您可以使用以下prepareStatement(),它接收结果集类型作为参数,或者执行以下操作:

        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);
        }

回答by deltaforce2

Like the exception says: You can't scroll your result set in any other direction than forwards. So when you loop through your result set to get the row count (I don't even understand why you do it), then this row will throw that exception:

就像异常说的那样:除了向前之外,您不能向任何其他方向滚动结果集。因此,当您遍历结果集以获取行数时(我什至不明白您为什么这样做),那么这一行将抛出该异常:

rs.beforeFirst();

because that would scroll backwards.

因为那会向后滚动。

Either create your statement so that you can scroll it (Google for examples) or remove that row counting. I'd suggest the latter, since the count seems unnecessary.

创建您的语句以便您可以滚动它(例如谷歌)或删除该行计数。我建议后者,因为计数似乎没有必要。

回答by Adithya Surampudi

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

这样你就可以向前和向后移动,所以担心的事情就少了

回答by Sai

You can only do this with a resultset that is of type TYPE_SCROLL_SENSITIVE, which is defined as "The constant indicating the type for a ResultSet object that is scrollable and generally sensitive to changes made by others."

您只能对类型为 TYPE_SCROLL_SENSITIVE 的结果集执行此操作,该结果集定义为“指示可滚动且通常对其他人所做的更改敏感的 ResultSet 对象的类型的常量”。

You need to do something like the following ...

您需要执行以下操作...

Statement statement = 
 connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_READ_ONLY);

回答by othman

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:

rowCount 变量不是必需的。您正在 rs 上执行两个循环。仅需要第二个循环来获取由这部分代码完成的行数:

 while (rs.next()){
 typeID=rs.getInt(1); //typeID is the number of rows in the ResultSet
}

回答by kapil

java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY

java.sql.SQLException: 结果集类型为 TYPE_FORWARD_ONLY

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

使用 JDBC 2.0 API,用户可以灵活地向前或向后移动光标。

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

回答by aman_novice

This question is pretty old. I believe the solution would already have been found. However, i would like to suggest here something different from what Aditya did.

这个问题很老了。我相信已经找到了解决方案。但是,我想在这里提出与 Aditya 所做的不同的建议。

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

Instead of ResultSet.TYPE_SCROLL_SENSITIVE, i would use INSENSITIVE

而不是 ResultSet.TYPE_SCROLL_SENSITIVE,我会使用 INSENSITIVE

Check this link for refernce

检查此链接以供参考

回答by Ongati Felix

Though this question is old, answers do not age, encountered a similar problem today, this is how I approached it, as hereThis 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

虽然这个问题很老,但答案不老,今天遇到了类似的问题,我是这样处理的,因为这里是Java JDBC驱动程序和PostgreSQL数据库提供的功能。本例使用默认参数创建Statement对象,系统生成的数据集只能是单向向前移动指针,不能双向移动数据记录指针,前者

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

语句stmt = dbConn.createStatement();
结果 rs = stmt.executeQuery (sql);

改为
Statement stmt = dbConn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
结果 rs = stmt.executeQuery (sql);

此时生成的rs可以使用rs.first()进行反向移动指针操作