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?
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.
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();
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:
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.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.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();
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();
}
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>();
où T
est un objet POCO défini dans votre code.