2017-02-05 15 views
-1

SQLテーブルから整数値を取得していない現在の行は、私は、SQLテーブルから登録ユーザの(つまりINTEGER NOT NULL GENERATED ALWAYS AS IDENTITYある)のIDを取得しようとしていますいわゆる "USERS"、int _id = rs2.getInt("UserID");を呼び出すとき、それは私に例外をスロー:ここInvalid cursor state - no current row. は、私がこれまで持っているものです:Servlet.javaでカーソル状態が無効 - 私はこれについて多くのことを探してきたが、何も私の問題を解決していない

:UAppConstants.javaで

try{ 
    stmt = conn.prepareStatement(UAppConstants.SELECT_USERID_BY_NAME); 
    System.out.println("1"); 
    stmt.setString(1, _username); 
    System.out.println("2"); 
    ResultSet rs2 = stmt.executeQuery(); 
    System.out.println("3"); 
    int _id = rs2.getInt("UserID"); //exception here 
    System.out.println("the registered user id is" + _id); 

}catch (SQLException e) { 
     System.err.println(e.getMessage()); // print error 
} 

public final String CREATE_USERS_TABLE = "CREATE TABLE USERS (UserID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY,username varchar(10) NOT NULL,password varchar(8) NOT NULL,description varchar(50) DEFAULT NULL,nickname varchar(20) NOT NULL,photo varchar(100) DEFAULT NULL)"; 
public final String INSERT_USER_STMT = "INSERT INTO USERS (username,password,nickname,description,photo) VALUES (?,?,?,?,?)"; 
public final String SELECT_USERID_BY_NAME = "SELECT UserID FROM USERS WHERE username=? "; 

UserModel.java:

public class User { 
private String Username, Password, Description, Photo,Nickname;//user "schema" 
private int UserID; 


public User(String name, String pass, String nick,String desc,String photo) { 
    Username = name; 
    Password = pass; 
    Description = desc; 
    Photo = photo; 
    Nickname = nick; 
} 



/* Getters & Setters */ 

public int getUserID() { 
    return UserID; 
} 

public void setUserID(int uid) { 
    this.UserID = uid; 
} 

//the rest of getters and setters 

例外:

INFO: Reloading Context with name [/ExampleServletv3] is completed 
     1 
     2 
     3 
     Invalid cursor state - no current row. 

誰かが何をすべきかを私に指示することができますか? は、カーソルは最初の行の前に置かれ、executeQueryたら

+0

はstracktraceではありません。代わりに、Webサーバーのログの一部であり、スタックトレースでいくつかのエラーが含まれます。それらのすべては、再デプロイメントのためにサーバーをシャットダウンすることに関連しています。だから彼らは手元の問題とは何の関係もない。あなたの問題に関連する唯一のエラーメッセージは最後の行にあり、stracktraceがありません。私の答えに記述されているようにエラー処理を改善してください。 – Codo

+0

あなたは 'sql-server'でこの質問にタグを付けましたが、DDLはMicrosoft SQL Server構文ではありません。 –

答えて

0

に感謝します。したがって、まだデータにアクセスすることはできません。まず、カーソルを最初の行に移動するにはnext()に電話する必要があります。

だから、それは次のようになります。

stmt = conn.prepareStatement(UAppConstants.SELECT_USERID_BY_NAME); 
stmt.setString(1, _username); 
ResultSet rs2 = stmt.executeQuery(); 
if (rs2.next()) { 
    int _id = rs2.getInt("UserID"); 
    // do something with the id 
} else { 
    // user not found 
} 

と例外処理のためのヒント:代わりに鈍いprint文を使用してコードを左官工事、非常に最小限のメッセージを除いて例外を処理していないのは、例外を再スロー:

try { 
    // code 
} catch (SQLException e) { 
    throw new RuntimeException(e); 
} 

このようにすると、すべてのネストされた例外を含む完全なエラーメッセージが表示され、例外がスローされた行も表示されます。あなたがあなたの質問に追加した何

関連する問題