JDBC retour jeu de résultats vide
Je suis à l'aide de JDBC pour de très simple connectivité de base de données.
J'ai créé ma connexion/déclaration et exécuté une requête.
Je vérifie la requête de l'objet de l'instruction dans le débogueur de confirmer qu'il est l'envoi d'un bon de requête.
J'ai ensuite vérifié la requête (copié directement à partir du débogueur) sur la base de données pour s'assurer qu'il renvoie des données.
Le retour de l'objet resultset, cependant, donne de faux .next()
Existe-il des écueils les plus courants ici que je suis absent?
public List<InterestGroup> getGroups() {
myDB.sendQuery("select distinct group_name From group_members where
username='" + this.username + "'");
ResultSet results = myDB.getResults();
List<InterestGroup> returnList = new ArrayList<InterestGroup>();
try {
while (results.next()) {
returnList.add(new InterestGroup(results.getString("group_name"), myDB));
}
return returnList;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
Et la myDB classe (wrapper simple qui me permet de supprimer la connexion/code d'instruction dans n'importe quel projet)
public void sendQuery(String query){
this.query = query;
try {
if(statement == null){
statement = connection.createStatement();
}
results = statement.executeQuery(query);
} catch (SQLException e) {
System.out.println(query);
currentError = e;
results = null;
printError(e, "querying");
}
}
public ResultSet getResults(){
return results;
}
EDIT:
Basé sur les suggestions que j'ai surtout remanié mon code mais toujours le même problème. Ci-dessous est une forme simplifiée de la portion de code qui a le même problème.
private boolean attemptLogin(String uName, String pWord) {
ResultSet results;
try{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
connection =DriverManager.getConnection(connectionString,user,password);
PreparedStatement statement = connection.prepareStatement("select username from users where username='testuser'");
results = statement.executeQuery();
if(results != null && results.next()){
System.out.println("found a result");
statement.close();
return true;
}
System.out.println("did not find a result");
statement.close();
return false;
}catch(SQLException e){
e.printStackTrace();
return false;
}
}
J'ai également codé en dur la requête en place pour l'instant à éliminer cette source d'erreur. Même problème qu'avant (ce qui se passe avec toutes les requêtes). Débogueur affiche tous les objets se instancié et pas de traces de pile sont imprimés. Par ailleurs, je suis en mesure d'utiliser le même code (et le plus compliqué code énumérés précédemment) dans un autre projet.
Il pourrait être à l'intérieur de la getResults fonction, si vous pouviez poster ça aussi ça aide beaucoup.
désolé, a ajouté que ainsi.
Êtes-vous sûr à 100% que votre
connectionString
, user
et password
sont corrects?Je n'ai en effet 🙂
OriginalL'auteur dpsthree | 2010-12-03
Vous devez vous connecter pour publier un commentaire.
J'ai tout compris....stupide Oracle n'a pas, comme le nombre de connexions simultanées que j'avais (toutes deux d'entre eux, l'un pour la console, un pour java). Malheureusement, le serveur n'est pas sous mon contrôle, donc je vais juste avoir à traiter avec elle. On pourrait penser que l'Oracle serait de fournir une meilleure réponse. Au lieu de cela, il revient tout juste des jeux de résultats vides.
Merci pour les réponses
modifier Depuis cela a été demandé/répondu il y a eu un certain nombre de personnes nous ont fait remarquer que la cause sous-jacente est plus probablement liée à la livraison/les paramètres de transaction en cours d'utilisation. S'il vous plaît être sûr de voir d'autres réponses pour des conseils supplémentaires et des solutions possibles.
Oui, j'ai été ssh ed dans l'ordinateur hôte afin d'exécuter des requêtes directement pour les tests. Et quand j'ai couru mon programme créé une autre connexion. Désolé si ma formulation m'a semblé étrange. J'étais très somnolent lorsque vous traitez avec cette dernière nuit.
Je suis tombé sur le même problème, quatre ans plus tard. Un grand merci à vous, et oui stupide Oracle.
OriginalL'auteur dpsthree
Je vois quelques pièges dans votre code, il y a quelques endroits où les choses peuvent aller mal:
D'abord, l'utilisation de relevés périodiques. Utilisation les requêtes préparées de sorte que vous n'aurez pas de problèmes avec L'injection SQL.
Au lieu de
utilisation
Avec cela, votre requête devient
et vous définir l'utilisateur avec
Prochaine, je n'aime pas l'utilisation de votre
myDB
classe. Que faire si les résultats estnull
? Vous n'êtes pas d'effectuer toute vérification des erreurs pour que, dans votrepublic List<InterestGroup> getGroups()
méthode.public void sendQuery(String query)
me semble que ça ne devrait pas êtrevoid
, mais il doit retourner unResultSet
. Aussi, la recherche sur le net pour une bonne façons de le faire JDBC gestion des exceptions.Aussi, cette ligne:
Pourquoi avez-vous
myDB
comme paramètre?Je suggère l'ajout de plus de
System.out.println
énoncés dans le code de sorte que vous pouvez voir où les choses peuvent aller mal.OriginalL'auteur darioo
En java.sql.connexion vous devez appeler cette méthode après la création de votre connexion :
peut-être il ya une méthode similaire dans Oracle.
OriginalL'auteur
La même chose m'est arrivé. J'ai été en utilisant SQL Developer pour insérer des données de test dans ma base de données et le test de lecture que l'utilisation de JDBC. Mais je n'ai eu un résultat vide. J'ai pu obtenir les noms de colonnes et tout, mais a eu un problème avec la lecture des données. Comme l'a souligné dpsthree plus tôt, j'ai déconnecté du SQL Developer IDE et puis il m'a demandé de s'Engager à la sortie.
Le tour est joué! Le problème était que les modifications aux bases de données à l'aide de la commande insérer n'ont pas commis.
Pour SQL Developer est situé à Préférences > Base de données > Avancé > Autocommit
Cela a résolu mon problème.
OriginalL'auteur anuvab1911
La plus commune est d'avoir plusieurs instructions dans la requête:
Pour les états qui ne retourne pas de résultats, vous devez utiliser une autre structure. Ce sera au client de s'étouffer:
Les deux même en forme de jeux de biff le client.
OriginalL'auteur wallyk
J'ai eu ingénieurs avec ce problème de démontrer cette vérification en face de moi. Il s'avère qu'ils ont été connecté avec un compte de base de données dans le programme et avec une autre base de données compte dans interactive SQL, shell. [C'était Oracle 8.]
OriginalL'auteur Bert F
Dans le passé, j'ai eu des problèmes similaires dans le code comme ceci:
Ce que j'ai fait dans cette situation était de charger toutes les données dans une mémoire locale de la structure de données avec un minimum d'attente sur le jeu de résultats.next(). Ensuite, j'ai fait tout ce que j'avais sur les données de la locale de la structure de données après gracieusement de clôture du jeu de résultats. Ce comportement a été avec Oracle 10 sur Unix backend/JDK 1.6.0_22 client sous Windows XP.
Espère que cette aide.
OriginalL'auteur Chirantan
Veuillez vérifier si la connexion et de la déclaration de l'Objet vivant jusqu'à ce que vous parcourez l'ensemble de résultats, quelques fois on peut fermer sans le savoir.
OriginalL'auteur gmhk
Ouais, j'ai eu le même problème que l'OP. Cela arrive quand vous avez deux ou plus, les connexions avec la base de données sur le même utilisateur. Par exemple, une connexion à SQL Developer et une connexion en Java. Le résultat est toujours un jeu de résultats vide.
EDIT: j'ai Également remarqué qu'il se passe lorsque vous exécutez la procédure ou de l'insérer dans la databse et vous ne validez pas vos transactions.
OriginalL'auteur westman379
J'avais connecté au serveur à l'aide de plsql client et, bien que j'ai essayé de vous connecter à partir de mon code, j'étais connecté mais aucun dossier n'a été dans l'ensemble résultat. Seulement après la déconnexion du serveur, le résultat a été peuplée.
Je suis d'accord avec @dpsthree, Oracle devrait fournir des mesures de l'erreur/message d'avertissement.
OriginalL'auteur Yash
dans mon cas, la requête qui a travaillé dans sql développeur n'a pas de travail en JAVA.
formatage process_date de char a aidé à le faire fonctionner en JAVA
OriginalL'auteur user3916827
Pour moi le problème est que sur la création de la colonne de clé primaire, je n'avais PAS NULL ACTIVER. Comme dans ...
Quand j'ai recréé la table sans que, comme dans l'
Il a commencé à travailler via JDBC. Je suis à l'aide de ojdbc6.jar pour le pilote jdbc.
OriginalL'auteur Martin Benns
Le jeu de résultat renvoie la valeur false, même si vous devriez obtenir les valeurs de ligne de la requête et de la rs.next() donne une fausse parce que vous n'auriez pas écrit commettre; sur votre sql terminal pour la requête. Après avoir fait cela, vous aurez obtenir rs.next() comme Vrai.
OriginalL'auteur Sushmita Mitkar
Il pourrait être une condition que votre table n'est pas commis .
Essayez de l'insérer de nouveaux enregistrements, puis engagez-vous dans votre SQL Exécuter Fenêtre de Commande et exécutez votre code.
OriginalL'auteur Shara Rizvi