web-dev-qa-db-ja.com

ResultSet:例外:セットタイプはTYPE_FORWARD_ONLYです-なぜですか?

私は非常に単純なコードを持っています:

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

しかし、このコードを実行すると、私は得ています...

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$1.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)

何が原因で、どうすれば修正できますか?

14
sAaNu

最初のステートメントをこれに変更します

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

この方法で前後に移動できるため、心配することは少なくなります

18

タイプ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);
        }
14
MByD

これは、タイプTYPE_SCROLL_SENSITIVEの結果セットでのみ実行できます。これは、「スクロール可能で、一般に他のユーザーによる変更に影響を受けるResultSetオブジェクトのタイプを示す定数」として定義されています。

次のようなことをする必要があります...

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

この質問は古く、回答は古くならず、今日同様の問題が発生しましたが、これが hereこれは、Java JDBCドライバー、およびPostgreSQLデータベースによって提供される機能です。この場合、デフォルトのパラメーターを使用してStatementオブジェクトを作成します。システム生成のデータセットは、前向きのポインタであり、双方向のモバイルデータレコードポインタではなく、前者

ステートメントstmt = dbConn.createStatement();
結果rs = stmt.executeQuery(sql);

変更後
ステートメントstmt = dbConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE、ResultSet.CONCUR_READ_ONLY);
結果rs = stmt.executeQuery(sql);

この時点で生成されたrsは、rs.first()を使用してポインター操作を逆に移動できます

6
Ongati Felix

例外のように:結果セットを前方以外の方向にスクロールすることはできません。したがって、結果セットをループして行数を取得すると(なぜそれを行うのかさえわからない)、この行はその例外をスローします。

rs.beforeFirst();

それは後方にスクロールするからです。

スクロールできるようにステートメントを作成(例としてGoogle)するか、行カウントを削除します。カウントは不要に思えるので、後者をお勧めします。

3
deltaforce2

この質問はかなり古いです。解決策はすでに見つかっていると思います。しかし、私はここでアディティアがやったこととは異なる何かを提案したいと思います。

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

ResultSet.TYPE_SCROLL_SENSITIVEの代わりに、INSENSITIVEを使用します

このリンクを参照してください

2
aman_novice

Java.sql.SQLException:結果セットのタイプはTYPE_FORWARD_ONLYです

jDBC 2.0 APIを使用すると、ユーザーはカーソルを前後に柔軟に移動できます。

次のようにstatemntを作成することでエラーを取り除くことができます

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

また、行数を数えるより良い方法は

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
2
kapil

rowCount変数は必要ありません。 rsで2つのループを実行しています。コードのこの部分で実行される行数を取得するには、2番目のループのみが必要です。

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