2009-07-07 8 views
30

Ho una stored procedure che registra alcuni dati, come posso chiamare questo con NHibernate?Come si chiama una procedura memorizzata da NHibernate che non ha alcun risultato?

Finora ho:

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

Quale dovrebbe essere il metodo ????? essere? O sto facendo qualcosa di più fondamentalmente sbagliato?

risposta

14

Questo sembra essere una limitazione di NHibernate, da NHibernate Documentation:

La procedura deve restituire un set di risultati. NHibernate utilizzerà IDbCommand.ExecuteReader() per ottenere i risultati.

+4

Io non lo definirei un "limite", più come "by design". – mxmissile

12

NHibernate consente di eseguire la programmazione orientata agli oggetti e si occupa di prelevare gli oggetti da e salvare gli oggetti nel database dietro le quinte.

NHibernate non fornisce un'API semplice per eseguire semplicemente stored procedure, perché non sembra avere molto a che fare con la programmazione orientata agli oggetti, sia che prelevi oggetti o che li salvi.

Quindi stai facendo qualcosa di fondamentalmente sbagliato nel tentativo di utilizzare direttamente NHibernate per eseguire codice altamente procedurale. Se vuoi usare NHibernate, devi dire come l'esecuzione di questa stored procedure dietro le quinte ti aiuterà magicamente a prelevare oggetti da e salvare oggetti nel database.

è possibile:

  • utilizzare ADO.NET direttamente, aprendo un nuovo IDbConnection o di ottenere il collegamento s il ISession', la creazione di un IDbCommand, ecc Fate questo se avete bisogno di un approccio one-off per l'esecuzione memorizzata procedure.
  • Creare un listener NHibernate e configurarlo nello Configuration, per eseguire questa stored procedure quando determinati altri eventi vengono inviati attraverso la pipeline NHibernate. Esegui questa operazione solo se questa stored procedure deve essere effettivamente eseguita ogni volta e solo quando si verificano questi eventi.
51

ExecuteUpdate su SQL Query dovrebbe essere d'aiuto.

Esempio:

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

come si ottiene il valore restituito? – nicks

8

È possibile utilizzare UniqueResult per eseguire una stored procedure che non restituisce nulla. Sto usando quanto segue per chiamare un processo memorizzato che inserisce o aggiorna un record per tenere traccia degli utenti attualmente connessi al nostro sito MV.NET di ASP.NET.

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

query.UniqueResult(); 
+0

Grazie per aver funzionato correttamente con "ExecuteUpdate". – Schmalls

+0

Entrambi hanno funzionato per me dopo essermi assicurato che la stored procedure con i parametri sia stata compilata correttamente. –

0

In generale, chiamare una routine che esegue alcune altre faccende e restituire un set di risultati alla fine non è diverso che fare una ricerca SELECT. Pertanto, nelle risposte di cui sopra, quando si esegue la query nel l'ultimo passo è necessario chiamare

query.List<T>();

dove T è un oggetto POCO che è definito nel codice.

0

Una stored procedure deve restituire un set di risultati. Il primo parametro di una procedura deve essere un OUT che restituisce un set di risultati. Questo viene fatto usando un tipo SYS_REFCURSOR in Oracle 9i o successivo. Anche se non si desidera restituire alcun set di risultati, è necessario dichiarare il primo parametro nella stored procedure come CURSOR_NAME OUT SYS_REFCURSOR.

0

Do seguenti soluzioni:

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(); 
     } 
Problemi correlati