2011-02-21 14 views
8

Ho una procedura memorizzata che restituisce un valore, non un set di dati e ho problemi a farlo funzionare con EF4.Chiamata alla stored procedure con parametri

Ho visto questo: http://dotnet.dzone.com/news/how-retrieve-stored-procedure

Ecco quello che ho fatto: ho aggiunto una procedura per il modello, e importato una funzione.

Il primo problema che ho avuto è stato il fatto che i parametri nella mia procedura sono denominati come @_Parameter_in. Ciò ha portato EF a introdurli come p_Parameter_in perché non avrebbe funzionato con un carattere di sottolineatura come primo carattere. Quindi, quando ho chiamato la stored procedure, posso vedere nella chiamata di SQL Profiler che cerca @p_Parameter_in e ovviamente c'era un problema con quello.

Ora ho rinominato i parametri e ho esaminato SQL Trace: tutto sembra e funziona alla grande. Il problema è che non riesco a ottenere il valore. Ecco come il mio codice è:

System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32)); 
newKey.Value = 0; 
context.GetNextSurrogateKey_v2("tTest", newKey); 

Dopo aver chiamato newKey.Value, è sempre 0 o qualsiasi valore ho impostato a. Non riporta il valore. Ho il sospetto che il mio problema sia relativo all'importazione della funzione. Io uso Scalari e tipo di dati Int32. "Crea nuovo tipo complesso" è disabilitato per me per qualche motivo. Qualcuno aveva quel problema?

risposta

7

Sto indovinando qui poiché non riesco a vedere la stored procedure che stai chiamando. Penso che tu voglia recuperare un valore scalare che è stato restituito dalla stored procedure, piuttosto che il valore di un parametro di output come definito nella stored procedure.

Credo che si voglia definire una nuova funzione all'interno dell'EDM e puntarla nella procedura memorizzata. Una rapida google ha questo potenziale soluzione: http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

HTH

+0

Questo è qualcosa da guardare, potrei semplicemente modificare la procedura per lavorare in questo modo. Attualmente non restituisco il valore scalare. Assegno il valore al parametro OUTPUT nella stored procedure. – katit

+0

Anche questo non funziona. Ottengo l'errore "Il lettore di dati restituito dal fornitore di dati del negozio non ha colonne sufficienti per la richiesta richiesta" – katit

+0

Ok, l'ho fatto funzionare. Con l'inserimento selezionare @MyValue alla fine del processo memorizzato. La domanda è ancora aperta se è possibile utilizzare i parametri OUTPUT con EF. – katit

2

Il problema è che i parametri di processo in uscita EF dopo datareader estremità lettura. Questo di solito avviene dopo aver chiamato la funzione DataBind(). Ho avuto lo stesso problema con procedure di elaborazione più lunghe. Lo risolvo usando la funzione .ToList() su ObjectResult.

var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));  
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList(); 
this.ProductsCount = (int?)rowsCount.Value; 

Le singole righe o valori possono probabilmente risolvere con la funzione FirstOrDefault().

0

Ho avuto lo stesso problema descritto da Jan Remunda. Qualcuno ha cambiato il tipo di ritorno da Integer a Entity.Core.Objects.ObjectResult (di Integer?) Che ha comportato la mancata restituzione di nulla.

Per noi la soluzione era forzare EF a leggere il ritorno del processo memorizzato aggiungendo la funzione .FirstOrDefault() al ritorno.

Problemi correlati