31 votes

Comment appeler une procédure stockée depuis NHibernate qui n'a pas de résultat ?

J'ai une procédure stockée qui enregistre certaines données, comment puis-je l'appeler avec NHibernate ?

Jusqu'à présent, j'ai :

ISession session = ....
IQuery query = session.CreateQuery("exec LogData @Time=:time @Data=:data");
query.SetDateTime("time", time);
query.SetString("data", data);
query.?????;

Quelle devrait être la méthode ????? être ? Ou est-ce que je fais quelque chose de plus fondamentalement mauvais ?

54voto

Sathish Naga Points 1086

ExecuteUpdate sur la requête SQL devrait vous aider.

Un échantillon :

ISession session = ....
IQuery query = session.CreateSQLQuery("exec LogData @Time=:time, @Data=:data");
query.SetDateTime("time", time);
query.SetString("data", data);
query.ExecuteUpdate();

15voto

thatismatt Points 5094

Il semble qu'il s'agisse d'une limitation de NHibernate, de Documentation sur NHibernate :

La procédure doit renvoyer un ensemble de résultats. NHibernate utilisera IDbCommand.ExecuteReader() pour obtenir les résultats.

12voto

yfeldblum Points 42613

NHibernate vous permet de faire de la programmation orientée objet et se charge en coulisse d'aller chercher les objets dans la base de données et de les y enregistrer.

NHibernate ne vous fournit pas d'API simple pour exécuter des procédures stockées, car cela ne semble pas avoir grand-chose à voir avec la programmation orientée objet, qu'il s'agisse d'aller chercher des objets ou de les enregistrer.

Vous faites donc quelque chose de fondamentalement mauvais en essayant d'utiliser NHibernate directement pour exécuter du code hautement procédural. Si vous voulez utiliser NHibernate, vous devez lui expliquer comment l'exécution de cette procédure stockée en arrière-plan va magiquement faciliter l'extraction et l'enregistrement d'objets dans la base de données.

Vous pouvez :

  • Utilisez ADO.NET directement, en ouvrant une nouvelle IDbConnection ou obtenir le ISession en créant une IDbCommand etc. Faites-le si vous avez besoin d'une approche ponctuelle pour exécuter des procédures stockées.
  • Créez un écouteur NHibernate et configurez-le dans le fichier Configuration pour exécuter cette procédure stockée lorsque certains autres événements sont envoyés par le pipeline NHibernate. Ne le faites que si cette procédure stockée doit être exécutée à chaque fois et uniquement lorsque ces événements se produisent.

10voto

Pete Nelson Points 643

Vous pouvez utiliser UniqueResult pour exécuter une procédure stockée qui ne renvoie rien. J'utilise ce qui suit pour appeler un processus stocké qui insère ou met à jour un enregistrement pour suivre les utilisateurs actuellement connectés à notre site ASP.NET MVC.

IQuery query = session.GetNamedQuery("UserSession_Save");
query.SetInt32("UserID", userID);
query.SetString("CookieID", cookieID);
query.SetString("Controller", controller);
query.SetString("Action", action);

query.UniqueResult();

0voto

katrash Points 399

En général, l'appel d'une procédure qui effectue d'autres tâches et renvoie un ensemble de résultats à la fin n'est pas différent de l'appel d'une procédure de type SELECT la requête. Par conséquent, dans les réponses ci-dessus, lorsque vous exécutez la requête à la dernière étape, vous devez appeler

query.List<T>();

donde T est un objet POCO qui est défini dans votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X