0

「customer_id」、「email」、「deliverable」、および「create_date」列を持つテーブル「customer」にアクセスするJavaコードを作成しようとしています

私は持っている

        Connection conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword);
        Statement constat = conn.createStatement();
        String query = "SELECT * FROM customer WHERE customer_id LIKE " + customerId;
        ResultSet rtn = constat.executeQuery(query);
        Customer cust = new Customer(rtn.getInt("customer_id"), rtn.getString("email"),  rtn.getInt("deliverable"), rtn.getString("create_date"));
        conn.close();
        return cust;

エラーが表示されます:

java.sql.SQLException: 結果セットの開始前

私が知る限り、私のエラーは新しい Customer オブジェクトを作成している行にありますが、何が間違っているのかわかりません。誰か助けてくれませんか?ありがとう!

4

3 に答える 3

1

行のデータにアクセスする前に、常に次の行に移動する必要がありますresultSet.next()(チェックすると true が返されます)。

Customer cust = null;
if (rtn.next()) {
    cust = new Customer(rtn.getInt("customer_id"), 
                        rtn.getString("email"), 
                        rtn.getInt("deliverable"), 
                        rtn.getString("create_date"));
}

また、

  • 文字列連結の代わりに準備済みステートメントを使用して、SQL インジェクション攻撃を回避し、より堅牢なコードを作成します
  • 接続、ステートメント、および結果セットを finally ブロックで閉じるか、Java 7 を使用している場合は try-with-resources 構造を使用します

JDBC チュートリアルを読む

于 2012-05-09T17:07:21.700 に答える
0

ResultSet.first()結果を最初の位置に移動するには、を呼び出す必要があります。結果セットは、クエリの結果全体を取得せずにメモリに保持するためのプログラミング規約です。first()そのため、そのインターフェイスは非常に低レベルであり、last()またはなどのメソッドを使用して行を明示的に選択する必要がありますnext()(それぞれが戻っtrueて、要求された行インデックスがセットにあるかどうかを確認します)

于 2012-05-09T17:10:15.650 に答える
0

追加する必要があります

rtn.next();

結果セットを使用する前に。

通常、これは次のように行われます

while (rtn.next()) {
  <do something with the row>
}
于 2012-05-09T17:10:48.893 に答える