2015-07-29 11 views
16
CREATE PROC spIsValidUser 
    @UserName varchar(50), 
    @Password varchar(50) 
AS 
    IF Exists(SELECT * FROM Users where [email protected] and [email protected]) 
    BEGIN 
     return 0 

    END 
    ELSE 
    BEGIN 
     return 1 
    END 
GO 

Ho creato questo Stored Procedure e Tring per chiamare questo Stored Procedure utilizzando Entity Framework. Di seguito è riportato il codice scritto in C#.ritorno stored procedure -1 per tutti i casi in Entity Framework

MyBusEntities db = new MyBusEntities(); 
int empQuery = db.spIsValidUser("abc", "[email protected]"); 

spIsValidUserStored Procedure ritorno -1 in tutti i casi. Per favore fatemi sapere errore

EDIT - Secondo data risposta, procedura di memorizzazione non viene utilizzato istruzione return perché Entity Framework non possono supportare stored procedure restituiscono valori scalari fuori dalla box..Let farmi sapere come posso inviare i dati scalari da Stored Procedure?

+0

Forse si tenta di entrare nel vostro codice, enumerare la procedura o manualmente eseguire la procedura direttamente in SQL Server? Lo sospetto, ma non è possibile dirlo a meno che non eseguiamo rapidamente il debug di questo. –

+0

definito db e istanziato correttamente. (quando si enumera) Ha una procedura spIsValidUser elencata. Cosa restituisce questa procedura quando la si chiama manualmente sul server SQL. –

+0

Sì. Ho eseguito manualmente spIsValidUser usando l'istruzione below in sQL Server. EXEC spIsValidUser 'abc' 'abc @ 123' e mi dà l'output 0. e ho anche controllato Db. È definito e istanziato correttamente. – chirag

risposta

7

La stored procedure restituisce attualmente un valore scalare . Utilizzare le seguenti operazioni per risolvere questo problema:

  • Modifica la stored procedure come questo (non utilizzare la parola chiave return nella stored procedure per restituire il valore, Entity Framework non può sostenere stored procedure ritorno scalari valori ., fuori dalla scatola, ma c'è un lavoro intorno):

    ALTER PROC spIsValidUser 
    @UserName varchar(50), 
    @Password varchar(50) 
    AS 
    SELECT Count(*) FROM Users where UserName= @UserName and Password= @Password 
    return 
    
  • è necessario importare la stored procedure come Function. Fare clic con il tasto destro del mouse sull'area di lavoro del modello Entity e selezionare Add -> Function Import.

  • Nella finestra di Add Function Import, immettere il nome che si desidera che il stored procedure da cui nel modello, scegliete il vostro procedura dal menu a tendina e selezionare il valore di ritorno della procedura di essere scalare .

  • Infine scrivere si codice come questo:

    MyBusEntities db = new MyBusEntities(); 
    System.Nullable<int> empQuery = db.spIsValidUser("abc", "[email protected]").SingleOrDefault().Value; 
    MessageBox.Show(empQuery.ToString());// show 1 if Exist and 0 if not Exist 
    

Edit: Penso sostegno dei valori di ritorno stored procedure dipende dalla versione di Entity Framework. Anche Entity Framework non ha un ricco supporto per le stored procedure perché è un ORM, non una sostituzione SQL.

5

Avete importato correttamente le procedure memorizzate nel modello EF? e stai impostando il tipo corretto di ritorno alle stored procedure ??

Ci sono 4 possibili tipo di ritorno che è possibile impostare per le procedure di I possibili tipi di ritorno sono:

  1. nessuno
  2. Scalari
  3. complessi
  4. Enti

voi è necessario impostare il tipo di ritorno degli scalari.

se non sai come impostare il tipo di ritorno, quindi ecco il tutorial completo http://www.binaryintellect.net/articles/30738a7c-5176-4333-aa83-98eab8548da5.aspx

esempio veloce.

CREATE PROCEDURE CustOrderCount 
    @CustomerID nchar(5) 
AS 
BEGIN 
    SELECT COUNT(*) FROM ORDERS 
     WHERE [email protected]; 
END 


NorthwindEntities db = new NorthwindEntities(); 
var count = db.CustOrderCount("ALFKI"); 
int ordercount = count.SingleOrDefault().Value; 

questo restituirà il conteggio dell'ordine int.

+0

Ho già provato questa cosa. Ho importato la procedura memorizzata nel modello EF e ho anche impostato il tipo di reso. fammi sapere quale tipo di reso devo impostare in questo caso? Attualmente ho impostato il tipo di ritorno "none". Ho anche provato a cambiare il tipo di scalare (Int32) ma mi ha dato l'esecuzione in esecuzione. – chirag

+0

Potresti mettere il tuo problema come soluzione campione in github e fornirci un accesso. Questo è l'unico modo in cui potrei dirti perché restituisce -1 –

+0

grazie vijay ... – chirag

5

Hai provato:

CREATE PROC spIsValidUser 
    @UserName varchar(50), 
    @Password varchar(50) 
AS 
    IF Exists(SELECT * FROM Users where [email protected] and [email protected]) 
    BEGIN 
     SELECT 0 

    END 
    ELSE 
    BEGIN 
     SELECT 1 
    END 
GO 
+0

sta funzionando bene. sta restituendo ObjectResult e dopo aver applicato la funzione SingleOrDefault() sta dando un risultato corretto. – chirag