0

私はクエリを実行できるこのsqliteデータベースを持っています「バーコードから*を選択してバーコード= 'CFMS-ZUFH-WRVY-EXAA'を取得し、単一の行を返します。しかし、私のJavaアプリケーションでは、ほとんど同じSQLを実行すると、空の結果セットを返します. 変数 last, email などは JTextFields ですが、問題はそれらの前にあります. if ステートメントも実行されず、その前に rs.next() を実行して if (true) を設定すると、 ResultSet が閉じているというエラー。

try {
    db.dbopen(config.getdbfolder(),config.getdbname()); 
    // barcode-barcode.replaceAll("\\s","");
    ResultSet rs=db.query("select * from barcode where barcode=?",barcode);

    if (rs.next()) {
        first.setText(rs.getString("first_name"));
        System.out.println(rs.getString("first_name"));
        last.setText(rs.getString("last_name"));
        email.setText(rs.getString("email"));
        phone.setText(rs.getString("phone"));
        subject.setSelectedItem(rs.getString("subject"));
        Boolean selected;
        if (rs.getString("baronly").equals("false")) selected=false;
        else selected=true;
        barcodebox.setSelected(selected);   
        update=true;

    } 
    db.conn.close();

} catch ( SQLException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

メソッドクエリは次のとおりです。

public ResultSet query(String sql, String barcode) throws SQLException {
    // TODO Auto-generated method stub
    PreparedStatement prep =conn.prepareStatement(sql);
    prep.setString(1, barcode);

    ResultSet rs= prep.executeQuery();  
    prep.close();
    return rs;
}
4

3 に答える 3

1

意図したバーコードにまだ空白が含まれている可能性があります。の結果に割り当てますreplaceAll

barcode = barcode.replaceAll("\\s","");
于 2013-05-14T23:09:11.730 に答える
1

メソッドでは、を返す前にqueryを閉じます。のJavadocによると:PreparedStatementResultSetclose

注: Statement オブジェクトが閉じられると、現在の ResultSet オブジェクトが存在する場合は、それも閉じられます。

を閉じないでください。を使用した後は閉じてPreparedStatementください。メソッドを削除し、そのコードを残りのコードとインラインで配置して、.queryResultSetqueryPreparedStatementResultSet

@Reimeus が既に述べたように、replaceAllback の結果を に代入しbarcodeます。

于 2013-05-14T23:09:57.133 に答える
0

したがって、これが@Reimeus @rgettmanの両方からの最終的な回答です。

        try {
            db.dbopen(config.getdbfolder(),config.getdbname()); 
            //you need to set this replaceAll return value to original variable
            barcode = barcode.replaceAll("\\s","");

            //make prep statement here in order to close it in the finally block
            PreparedStatement prep =conn.prepareStatement("select * from barcode where barcode=?");

            //modify query function to accept prepared statement instead of a string
            ResultSet rs=db.query(prep ,barcode);

            if (rs.next()) {
                first.setText(rs.getString("first_name"));
                System.out.println(rs.getString("first_name"));
                last.setText(rs.getString("last_name"));
                email.setText(rs.getString("email"));
                phone.setText(rs.getString("phone"));
                subject.setSelectedItem(rs.getString("subject"));
                Boolean selected;
                if (rs.getString("baronly").equals("false")) selected=false;
                else selected=true;
                barcodebox.setSelected(selected);   
                update=true;

            } 
            db.conn.close();

        } catch ( SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
         //finally you close prepared statement. note that closing prep also closes 
//resultset and closing connection won't clean up resultset nor prep according to most of 
//stackoverflow answers. However, it is recommended to close both resultset and prepared 
//statement explicitly
         prep.close();
         rs.close();
       }

これは、データベース テーブルが where 句の条件に一致する正しい値を持っているという条件で機能する必要があります。テスト実行時に、クエリが正常に実行されるかどうかを再確認してください。

于 2013-05-14T23:18:10.337 に答える