2009-07-17 9 views
1

Hérite d'une classe exécutant PreparedStatements sur une connexion.SQLException: JZ0S4: impossible d'exécuter une requête vide (de longueur nulle). sur une instruction préparée

public class doSomething { 
    private PreparedStatement ps; 

    public setPS (Connection conn) throws SQLException { 
     String sql = "select * from table where id = ?"; 
     ps = conn.prepareStatement(sql); 
    } 

    public void runSomething(String var){ 
     ps.setString(1,var); 
     ResultSet rs = ps.executeQuery(); 
     ... 
    } 
} 

J'appelle

doSomethingInstance.setPS(conn); 
doSomethingInstance.runSomething(var); 

d'une autre classe et ce lancers francs et exception au

ResultSet rs = ps.executeQuery(); 

L'exception est SQLException: JZ0S4: Impossible d'exécuter une requête vide (longueur nulle) . sur une déclaration préparée. Je ne comprends pas pourquoi. Est-ce que quelqu'un voit ce que je fais mal ici?

Merci!

+0

très étrange ... si l'instruction était vraiment vide, setString() ne devrait pas fonctionner en premier. Êtes-vous sûr que c'est le code correct/complet? ("public setPS (..." ne doit pas compiler: type de retour manquant) .Ne sais pas quelle base de données vous utilisez, mais "table" n'est pas un très bon nom pour une table, c'est un mot-clé réservé (MySQL au moins –

Répondre

1

Ce problème a été fixé folks. Un problème est survenu avec les autorisations de la base de données. La capture et l'impression de la pile sur

ResultSet rs = ps.executeQuery(); 

ont indiqué que la table accédée par la requête était introuvable. Je dois encore comprendre pourquoi le SQLException: JZ0S4: Impossible d'exécuter une requête vide (longueur nulle) est levée.

Merci de votre temps et de votre considération. Rohan

0

pouvez-vous imprimer le contenu de sql avant d'exécuter la requête? Je suspecte qu'il perd son contenu

+0

@rohangter: Je ne connais pas cette API, mais lancez-vous une requête différente de celle que vous avez préparée? –

1

Revenez en arrière et copiez le code directement à partir de votre fichier source, puis modifiez votre question. Vous avez une ambiguïté potentielle: Votre premier fragment appelle l'instruction préparée "preparedStatement", puis vous passez à "prepareStatement" (sans le "d"). Avoir un regard propre sur votre code source rendra l'isolation du problème plus facile. Avez-vous deux variables ou avez-vous mal saisi votre exemple?

[plus tard ...] Merci d'avoir mis à jour votre code. Je ne vois pas de problème évident avec ça. L'avez-vous parcouru avec un débogueur (par exemple, dans Eclipse) pour vous assurer que les deux méthodes sont appelées comme prévu?

+0

Je m'excuse J'ai corrigé le nom de l'objet Il s'agit essentiellement du même handle PreparedStatment utilisé par les deux méthodes. –

0

Est-ce que var non null? Est var du type correct (int au lieu de String je pense?)