web-dev-qa-db-fra.com

JDBC SQL SERVER: L'instruction n'a pas renvoyé de jeu de résultats.

J'exécute la requête suivante à partir de Microsoft SQL Server Studio, qui fonctionne correctement et affiche les résultats:

SELECT *
INTO   #temp_table
FROM   md_criteria_join
WHERE  user_name = 'tecgaw'

UPDATE #temp_table
SET    user_name = 'tec'
WHERE  user_name != 'tec'

SELECT *
FROM   md_criteria_join
WHERE  user_name = 'tec'
   AND view_name NOT IN (SELECT view_name
                         FROM   md_criteria_join
                         WHERE  user_name = 'tecgaw')
UNION
SELECT *
FROM   #temp_table
ORDER  BY view_name,
      user_name,
      crit_usage_seq,
      crit_join_seq 

Cependant, si j'exécute la même requête en Java, une exception est levée et indique "L'instruction n'a pas renvoyé de jeu de résultats". Voici le code Java:

statement = conn.getConnection().createStatement();
resultSet = stmt.executeQuery(sql.toString());

Est-ce parce que je ne peux pas faire plusieurs requêtes SQL dans une seule instruction (c'est-à-dire, créer le #temp_table, le mettre à jour, puis utiliser pour cela l'instruction choisie)?

10
user2966439

J'ai trouvé une question similaire dans StackOverflow ici . Vous devez activer la connexion pour prendre en charge plusieurs instructions et les séparer à l'aide de ;. Pour des exemples concrets, voir cette réponse. Cependant, ce n'est que pour MySql.

Aussi, je pense que vous pouvez réécrire votre SQL en une seule requête

SELECT columnA, columnB, 'tec' as user_name from md_criteria_join
WHERE (
       user_name = 'tec' 
   AND view_name NOT IN (
       SELECT view_name 
       FROM md_criteria_join 
       WHERE user_name = 'tecgaw')
   )
   OR user_name = 'tecgaw' 
ORDER BY view_name, user_name, crit_usage_seq, crit_join_seq

Une autre option consiste à déplacer vos instructions dans une procédure stockée et à les activer à partir de JDBC à l'aide de CallableStatement.

Ou peut-être devriez-vous essayer de l'exécuter avec plusieurs instructions jdbc comme celle-ci

Connection conn = conn.getConnection(); //just to make sure its on single connection
conn.createStatement("SELECT INTO #temp_table").executeUpdate();
conn.createStatement("UPDATE #temp_table").executeUpdate();
conn.createStatement("SELECT ...").executeQuery();

Notez que vous devez fermer des ressources et peut-être pour de meilleures performances, vous pourriez utiliser les méthodes addBatch et executeBatch

3
Antanas

JDBC devient confus par le nombre de lignes.

Vous devez utiliser SET NOCOUNT ON.

25
John Gietzen

Utilisez l'instruction execute pour manipulation de données like insérer, mettre à jour et supprimer et executeQuery pour récupération de données like select

Je vous suggère de séparer votre programme en deux déclarations, une execute et une executeQuery.

Si vous ne le souhaitez pas, essayez de séparer les instructions par un point-virgule. Mais je ne suis pas sûr de cette action si cela vous donne un résultat ou non.

17
Ravindra Gullapalli

dans ms sql, vous devez également définir nocount à droite au début de la procédure stockée et mettre fin à l'instruction de sélection/mise à jour/insertion de bloc avec ";"

1
Suresh Gourishett