Comment puis-je exécuter un Serveur MS SQL procédure stockée en java/jsp, le retour des données de la table?
J'ai de la difficulté de l'exécution d'un Serveur MS SQL procédure stockée à partir de Java/jsp. Je souhaite retourner un tableau de données; la dernière ligne de la procédure stockée est un habitué de l'instruction select à partir d'une table.
(À partir de ce point, l'exécution d'une procédure stockée est un jeu d'enfant dans PHP
.)
J'ai pris un coup d'oeil à ces sites pour vous aider:
www.2netave.com
www.stackoverflow.com
Je ne le savais pas, il y a une fonction uniquement pour les procédures stockées, comme je l'ai été en utilisant createStatement()
à la place.
Maintenant, s'il vous plaît comprendre la procédure stockée s'exécute parfaitement dans SQL Server Management Studio et je n'ai eu aucun problème d'exécution des requêtes ad-hoc en jsp/java avec createStatement()
.
J'ai créé une procédure stockée simple qui ne prend pas d'arguments, juste pour cerner le problème:
CREATE PROCEDURE sp_test AS
BEGIN
PRINT 'HELLO WORLD'
END
Voici le code dans ma page jsp:
Class.forName("net.sourceforge.jtds.jdbc.Driver");
java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:jtds:sqlserver://MySQLServer:1433/test", "user", "pass");
java.sql.CallableStatement cs = conn.prepareCall("{call sp_test}");
java.sql.ResultSet ResultSet = cs.execute();
Le navigateur me dit que la page ne peut être affichée car une interne. erreur de serveur s'est produite. Je sais que cela signifie qu'il ya un problème avec le code ci-dessus.
J'ai essayé ceci:
java.sql.ResultSet ResultSet = cs.executeQuery();
Et ce:
java.sql.CallableStatement cs = conn.prepareCall("{execute sp_test}");
Et ce:
java.sql.CallableStatement cs = conn.prepareCall("{exec sp_test}");
Et rien n'a fonctionné. Une fois que je peux obtenir ce travail, alors je peux gérer une véritable procédure stockée qui renvoie les données de la table d'une instruction select. Mais je ne peux même pas obtenir ce mannequin de la procédure stockée à travailler.
Ce que je fais mal ici?
Merci.
Mise à jour:
Vérifié les logs du serveur (IIS) et mon proxy HTTP, violoniste, et il n'est pas signaler quoi que ce soit. Cependant, IIS à l'aide de tomcat en tant que moteur de servlet jsp pages. Et tomcat fichier journal indique que:
An error occurred at line: 20 in the jsp file: /test.jsp
Type mismatch: cannot convert from boolean to ResultSet
17:
18: java.sql.CallableStatement cs = conn.prepareCall("{call sp_test}");
19:
20: java.sql.ResultSet ResultSet = cs.execute();
21:
22: // java.sql.ResultSet ResultSet = state.executeQuery(SQL);
23:
J'ai essayé de changer les ci-dessus pour:
cs.execute();
Et les fichiers journaux ont rapporté:
- Servlet.service() for servlet jsp threw exception
java.sql.SQLException: The EXECUTE permission was denied on the object 'sp_test', database 'test', schema 'dbo'.
Donc, j'ai compris je dois GRANT EXECUTE
à l'utilisateur. L'autre question est de retourner le tableau de données à partir d'une procédure stockée.
Si j'ai une procédure comme ceci:
CREATE PROCEDURE sp_test2 AS
BEGIN
SELECT * FROM TABLE
END
Comment manipuler les données de la table dans les jsp? Serait ResultSet
travail ou est-ce seulement pour les requêtes ad-hoc, par opposition à des procédures stockées, où on utiliserait createStatement()
pour exécuter une requête?
Merci.
Update2:
Solution:
Dans le but de manipuler les données de la table, j'ai eu à utiliser ce:
java.sql.ResultSet RS = cs.executeQuery();
Il a échoué sur execute()
et il a échoué sur l'appellation de la ResultSet
objet "ResultSet". Il ne s'est jamais plaint à ce sujet dans le passé avec createStatement()
. Mais pour une raison quelconque, avec des procédures stockées, il n'aimait pas cette convention de nommage.
Merci.
- parce qu'un interne. erreur de serveur s'est produite. Veuillez lire les journaux du serveur pour trouver l'exception/stacktrace et l'inclure dans votre question. Il contient la réponse.
- Bon, alors j'ai mis à jour la question et a trouvé que l'utilisateur n'a pas les autorisations appropriées pour exécuter. J'ai donc modifié les permissions de l'utilisateur (c'est à dire ACCORDER EXÉCUTER) et maintenant ça fonctionne. Il y a un boolean erreur avec le jeu de résultats. C'était juste un mannequin de la procédure; la véritable procédure de données de la table je veux processus. Comment cela peut-il être fait? Même que si je devais exécuter une requête ad-hoc?
- En passant, je vous remercie pour votre aide.
Vous devez vous connecter pour publier un commentaire.
Notre serveur d'appels stockés procs de Java comme soi - fonctionne sur SQL Server 2000 & 2008:
ResultSet rs = ps.executeUpdate();
linkMerci à Brian pour le code. J'ai été d'essayer de se connecter à sql server avec
{call spname(?,?)}
et j'ai eu des erreurs, mais quand j'ai modifier mon code pourexec sp...
il fonctionne très bien.Je poste mon code espère que cela aide les autres avec des problèmes comme le mien:
FWIW, sp_test ne sera pas de retour rien mais un nombre entier (tous les composants de SQL Server stockées procs il suffit de retourner un entier) et aucun des ensembles de résultats sur le fil (puisque pas d'instructions SELECT). Pour obtenir la sortie de l'IMPRESSION des déclarations, vous devez normalement utiliser l'événement InfoMessage sur la connexion (pas la commande) dans ADO.NET.