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
ResultSet: Exception: set type is TYPE_FORWARD_ONLY -- why?
提问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
回答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()进行反向移动指针操作