2011-07-29 17 views
1

私はResultSetを使用してSQL Serverからデータを取得しています。コードは次のようになります。私はこのようなResultSetをループしていJavaのResultSetのヘルプが必要

ResultSet rs = getValueFormTable(); 

do{ 
    // process data 
} while(rs.next()); 

は、10件のレコードがあると仮定し、私はResultSetの4番目の値にしています。第5のResultSetレコードの1つの値を取って、再び第4のResultsetレコードに戻る必要がある状況があります。

これは可能ですか?

+0

いいえ、残念ながらそれはありません。あなたは2つのパスでデータを処理する必要があります:すべてを最初のリストに書き出し、2番目のエントリを処理します。 – blubb

+0

ResultSetを配列に変換して自由に使うことができます – marioosh

+0

@Simon、@marioosh、なぜ 'resultSet.previous'? – Nivas

答えて

7

レコードが10個あり、4番目のResultSet Valueにあるとします。 5番目のResultSetの値を1つ取って4番目のResultSetに戻す必要があるという状況が発生します。それはJavaで可能ですか?

"スクロール可能な" ResulSetインスタンスは、結果セットをスクロールするために必要です。以前の結果セットを更新する必要がある場合は、スクロール可能で更新可能な結果セットが必要です(最後の段落では更新可能な結果セットについて説明しています)。通常、ResultSetTYPE_FORWARD_ONLYであり、next()方法を使用して順方向にのみスクロールすることができます。

あなたは前後にResultSetを移動するためのabsolute()previous()のような他の方法を呼び出すタイプTYPE_SCROLL_INSENSITIVEまたはTYPE_SCROLL_SENSITIVEResultSetインスタンスを作成する必要があります。スクロール可能ResultSetを作成

は、デフォルトのタイプは、先に述べたようTYPE_FORWARD_ONLYあるとして、StatementまたはPreparedStatementオブジェクトによって返さResultSetのタイプを指定する必要があります。そうする方法を示すスニペットを以下に示します。

PreparedStatement pStmt = Connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
ResultSet rs = pStmt.executeQuery(); 
... 
// You can now invoke rs.previous(), rs.absolute(n) etc. to move back and forth. 

あなたはどのようにConnection.createStatementConnection.prepareStatementConnection.prepareCall方法で特定のResultSetのタイプをする上に読んでもらいたいです。

ResultSetの内容を変更し、それを読み込むだけではなく、「更新可能な」ResultSetを作成する必要があります。これは、ResultSet並行処理タイプをCONCUR_UPDATABLEと指定することで簡単に実行できます。その後、updateXXXメソッドのいずれかを呼び出し、updateRowメソッドを使用してそれらのメソッドに従い、基になるデータソースを更新できます。

1

はい、できます、あなたが持っている場合はTYPE_SCROLL_INSENSITIVEまたはTYPE_SCROLL_SENSITIVEResultSet

使用ResultSet.previous

(あなたが最初の行にある場合、ResultSet.previousの呼び出しがfalseを返します(ただし、例外をスローされません)、後でresultSet.getStringのように現在の行が必要なメソッドを呼び出すとSQLExceptionが返されますResultSet.isFirst

結果Seeこのような方法がたくさんある場合は、docsを一度見てください。

+0

警告されても、実装されていると数えることはできません。たとえば、MS Accessに接続できるようにするJDBC-ODBCドライバは、NotImplementedExceptionをスローします。これはむしろ面倒です。 – blubb

1

最初do-whileは、ResultSetの結果を得るには良い方法ではありません。私はあなたにループwhileを使用するように勧めています。

while(rs.next()){ 
    ... 
} 

秒。はい、利用可能な場合は、前の行に戻る方法があります。

if(rs.previous()){ 
    //Do what value you want from previous record and jump to next record. 
} 
+0

ループの場合+1、ResultSetが 'TYPE_SCROLL_INSENSITIVE'または' TYPE_SCROLL_SENSITIVE'として作成されなければならないことに言及しない場合は-0.2です。 –