web-dev-qa-db-fra.com

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

J'ai une procédure stockée qui enregistre certaines données, comment puis-je appeler cela 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?

31
thatismatt

Cela semble être une limitation de NHibernate, de NHibernate Documentation :

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

14
thatismatt

ExecuteUpdate sur SQL Query devrait vous aider.

exemple:

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

NHibernate vous permet de faire une programmation orientée objet et s'occupe de récupérer les objets et de les enregistrer dans la base de données en arrière-plan.

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

Vous faites donc quelque chose de fondamentalement mauvais en tentant d'utiliser NHibernate directement pour exécuter du code hautement procédural. Si vous souhaitez utiliser NHibernate, vous devez lui dire comment l'exécution de cette procédure stockée en arrière-plan aidera comme par magie à récupérer des objets à partir et à enregistrer des objets dans la base de données.

Vous pouvez:

  • Utilisez ADO.NET directement, ouvrez un nouveau IDbConnection ou obtenez la connexion de ISession, créez un IDbCommand, etc. Faites-le si vous avez besoin d'une approche unique pour exécuter les enregistrements procédures.
  • Créez un écouteur NHibernate et configurez-le dans Configuration, pour exécuter cette procédure stockée lorsque certains autres événements sont envoyés via le pipeline NHibernate. Ne faites cela que si cette procédure stockée doit être exécutée à chaque fois et uniquement lorsque ces événements se produisent.
12
yfeldblum

Vous pouvez utiliser UniqueResult pour exécuter un proc stocké qui ne renvoie rien. J'utilise ce qui suit pour appeler un proc 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();
9
Pete Nelson

Faites les solutions suivantes:

public void Test(TestEntity TestEntity)
        {           
  IQuery query = NHSession.CreateSQLQuery("exec LogData :Time, :Data");
            query.SetParameter("Time", TestEntity.Time);
            query.SetParameter("Data", TestEntity.Data);
            object obj = query.UniqueResult();
        }
0
Ankush Band

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

query.List<T>();

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

0
katrash