J'ai un code très simple:
pstat=con.prepareStatement("select typeid from users where username=? and password=?");
pstat.setString(1, username);
pstat.setString(2, password);
rs=pstat.executeQuery();
int rowCount=0;
while(rs.next())
{
rowCount++;
}
rs.beforeFirst();
if(rowCount>=1)
{
while(rs.next())
{
typeID=rs.getInt(1);
}
Mais quand j'exécute ce code, je reçois ...
Java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY
at Sun.jdbc.odbc.JdbcOdbcResultSet.beforeFirst(Unknown Source)
at server.ClientImpl.login(ClientImpl.Java:57)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at Java.lang.reflect.Method.invoke(Unknown Source)
at Sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at Sun.rmi.transport.Transport$1.run(Unknown Source)
at Java.security.AccessController.doPrivileged(Native Method)
at Sun.rmi.transport.Transport.serviceCall(Unknown Source)
at Sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at Sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at Sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at Java.lang.Thread.run(Unknown Source)
Quelle est la cause de cela et comment puis-je y remédier?
Remplacez votre première déclaration par ceci
pstat=con.prepareStatement("select typeid from users where username=? and password=?",
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
De cette façon, vous pouvez avancer et reculer, donc moins de soucis
Le type TYPE_FORWARD_ONLY signifie que vous ne pouvez avancer que sur l'ensemble de résultats, pas vers l'arrière, vous obtenez donc une exception lorsque vous essayez de revenir avec la fonction beforeFirst()
. Au lieu de cela, vous pouvez utiliser la commande prepareStatement () suivante, qui reçoit le type d'ensemble de résultats en tant que paramètre, ou pour le faire:
pstat=con.prepareStatement("select typeid from users where username=? and password=?");
pstat.setString(1, username);
pstat.setString(2, password);
rs=pstat.executeQuery();
int rowCount=0;
while(rs.next())
{
rowCount++;
typeID=rs.getInt(1);
}
Vous ne pouvez le faire qu'avec un jeu de résultats de type TYPE_SCROLL_SENSITIVE, qui est défini comme "La constante indiquant le type d'un objet ResultSet qui peut défiler et qui est généralement sensible aux modifications apportées par d'autres".
Vous devez faire quelque chose comme ce qui suit ...
Statement statement =
connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
Bien que cette question soit ancienne, les réponses ne vieillissent pas, j'ai rencontré un problème similaire aujourd'hui, c'est ainsi que je l'ai abordé, comme ici Il s'agit de la fonctionnalité fournie par Java et base de données PostgreSQL. Ce cas crée un objet Statement à l'aide des paramètres par défaut, les ensembles de données générés par le système ne peuvent être que pointeur vers l'avant, et non pointeur d'enregistrement de données mobiles bidirectionnel, l'ancien
Instruction stmt = dbConn.createStatement ();
Résultat rs = stmt.executeQuery (sql);
Remplacé par
Instruction stmt = dbConn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
Résultat rs = stmt.executeQuery (sql);
Généré à ce moment, rs peut utiliser rs.first () inverser déplacer l'opération du pointeur
Comme le dit l'exception: vous ne pouvez pas faire défiler votre jeu de résultats dans une autre direction que vers l'avant. Donc, lorsque vous parcourez votre jeu de résultats pour obtenir le nombre de lignes (je ne comprends même pas pourquoi vous le faites), cette ligne lèvera cette exception:
rs.beforeFirst();
car cela ferait défiler vers l'arrière.
Créez votre relevé afin de pouvoir le faire défiler (Google pour des exemples) ou supprimez le décompte des lignes. Je suggère ce dernier, car le décompte semble inutile.
Cette question est assez ancienne. Je pense que la solution aurait déjà été trouvée. Cependant, je voudrais suggérer ici quelque chose de différent de ce qu'a fait Aditya.
pstat=con.prepareStatement("select typeid from users where username=? and password=?",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
Au lieu de ResultSet.TYPE_SCROLL_SENSITIVE, j'utiliserais INSENSITIVE
Java.sql.SQLException: le type d'ensemble de résultats est TYPE_FORWARD_ONLY
avec l'API JDBC 2.0, l'utilisateur a la possibilité de déplacer le curseur vers l'avant ou vers l'arrière.
Votre erreur peut être supprimée en créant le statut comme suit
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
De plus, une meilleure façon de compter le nombre de lignes serait
rs=pstat.executeQuery(); //execute the query
rs.last(); //move the cursor to the last row
int numberOfRows = rs.getRow(); //get the number of rows
rs.beforeFirst(); //back to initial state
la variable rowCount n'est pas nécessaire. vous effectuez deux boucles sur le rs. seule la deuxième boucle est nécessaire pour obtenir le nombre de lignes qui se fait par cette partie du code:
while (rs.next()){
typeID=rs.getInt(1); //typeID is the number of rows in the ResultSet
}