2016-06-11 3 views
2
このテーブルの構造を考えると

です。 rstを反復処理すると、常にnullが返されます。はなぜ返されるResultSetヌル

public ResultSet Detail(String mobile) throws Exception { 
    dbConnect(); // make connection 
    String sql = "select * from profile where mobile = ?"; 
    PreparedStatement pstmt = con.prepareStatement(sql); 
    pstmt.setString(1, mobile); 
    ResultSet rst = pstmt.executeQuery(); 
    dbClose(); // connection closed 
    return rst; 
} 

は今、私はリターンからそれを受信した後rstを反復処理する場合、私はnull値を取得します。

try { 
    ResultSet rst = new DB().Detail(mobile); 
    String fname = rst.getString("firstname"); 
    String lname = rst.getString("lasttname"); 
    String date = rst.getString("dateofbirth"); 
    System.out.println("First name : " + fname + "\nLast Name : " + lname + "\nDate of Birth : " + date); 
} catch (Exception exc) { 
    exc.printStackTrace(); 
} 

出力:あなたはあなたがResultSetからのデータ要素にアクセスすることができます前next()方法を呼び出す必要がResultSetの公式ドキュメントによると

First name : null 
Last name : null 
Date of Birth : null 
+1

Javaコードスタイルガイドラインに従うだけのこと: 'Detail(String mobile)'メソッドの名前を 'getDetail(String mobile)'に変更する必要があります。Javaメソッド名は常に小文字で始まります。例えば ​​'get'(ゲッターメソッド)、' set'(セッターメソッド)、 'is'(ブールゲッターメソッド)のような動詞です。 – TuringTux

答えて

1

A ResultSetカーソルは、最初の行の前に最初に配置されます。次のメソッドへの最初の呼び出しによって、最初の行が現在の行になります。 2番目の呼び出しは2番目の行を現在の行にします。

投稿されたコードの断片にこれがありません。したがって、あなたのコード断片番号。 2次のように記述する必要があります:ジャラルKiswaniによってコメント/答えで述べたように

try { 
    ResultSet rst = new DB().Detail(mobile); 
    if(rst.next()) { 
     String fname = rst.getString("firstname"); 
     String lname = rst.getString("lasttname"); 
     String date = rst.getString("dateofbirth"); 
     System.out.println("First name : " + fname + "\nLast Name : " + lname + "\nDate of Birth : " + date); 
    } else { 
     System.out.println("No data for the given parameter '" + mobile + "'"); 
    } 
} catch (Exception exc) { 
    exc.printStackTrace(); 
} 

、それはあなたがResultSetの処理を完了している前に、DB接続を閉じないためにもお奨めです。

希望します。

1

データベース接続を閉じると、関連するすべてのオブジェクト(結果セットとプリペアドステートメント)が閉じられます。したがって、rsは有効ではありませんdbClose(); 接続を閉じる前に結果セットを読み取る必要があります。

+0

'java.sql.Connection#close()'が実際には 'dbClos​​e()'の実装で呼び出され、OP ...;では表示されないという前提に基づいて) – MWiesner

+1

接続を閉じていない場合、prepapred文または 'dbClos​​e()'の結果セットの場合は、レコードを読む前に 'if(rs.next())'を呼ぶことでMWiesnerの答えに従うべきです。 –

+0

実際、両方の回答の両方のアドバイスに従うべきです。 – MWiesner

関連する問題