2017-09-14 1 views
1

Aufruf ich auf folgende Weise eine gespeicherte Prozedur von Entity Framework zu nennen versuchen:eine ganze Zahl resultiert aus einer gespeicherten Prozedur Get Entity Framework fehl verwenden, wenn Context.Database.SqlQuery <int>

Context.Database.SqlQuery<int>(sqlSP, params).FirstOrDefault(); 

aber ich bekomme diese Fehler:

The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types

Mit LinqPad Sie, dass die gespeicherte Prozedur funktioniert sehen

enter image description here

Der generierte Code aus LinqPad für den gleichen Anruf in SQL ist die folgende

-- Region Parameters 
DECLARE @RETURN_VALUE Int 
DECLARE @contenttype VarChar(50) = '' 
DECLARE @image VarBinary(1000) = null 
DECLARE @applicationid Int = 81725 
DECLARE @statusid Int = 10 
DECLARE @notes VarChar(1000) = '' 
DECLARE @requestuserid Int = 59 
DECLARE @assigneduserid Int = 655 
DECLARE @parentid Int = 0 
DECLARE @eventid Int = 0 
DECLARE @discipline Int = 5 
DECLARE @replyby DateTime = '2017-09-14 16:22:40.082' 
DECLARE @workitemid Int = 81725 
DECLARE @messagetype Int = 2 
DECLARE @inspectionid Int = 6081 
DECLARE @floor SmallInt = 3 
-- EndRegion 
exec @RETURN_VALUE = [dbo].[usp_InsertInspectionEventPublic] @contenttype, @image, @applicationid, @statusid, @notes, @requestuserid, @assigneduserid, @parentid, @eventid, @discipline, @replyby, @workitemid, @messagetype, @inspectionid, @floor 

Die gespeicherte Prozedur immer eine ID in der folgenden Art und Weise zurück:

select @id = SCOPE_IDENTITY() from TEMPTABLE 
Return @id 

ich dies auch versucht:

var returnCode = new SqlParameter("@ReturnCode", SqlDbType.Int); 
returnCode.Direction = ParameterDirection.ReturnValue; 

var sql = "exec @ReturnCode =dbo.usp_insertinspectioneventpublic @contenttype, @image, @applicationid, @statusid, @notes, @requestuserid, @assigneduserid, @parentid, @eventid, @discipline, @replyby, @workitemid, @messagetype, @inspectionid, @floor"; 
var data = Context.Database.SqlQuery<int>(sql, returnCode, inParameters); 
var res = data.FirstOrDefault(); 
return res; 

Aber ich bekomme einen weiteren Fehler mit diesem Ansatz: Bei der Ausführung eines Befehls, parametrierte rs müssen ausschließlich Datenbankparameter oder Werte sein. Was kann hier das Problem sein?

+0

Der Rückgabewert ist anders als ein Ergebnissatz. Die SqlQuery gibt die Ergebnismenge zurück. Ich bin nicht so vertraut, aber Sie können möglicherweise auf den Parameter mit der Richtung 'ReturnValue' von' params' zugreifen (was ein Schlüsselwort ist, also nicht verwenden) – Crowcoder

Antwort

0

SqlQuery<T>() sucht nach einem Resultset, nicht nach einem Ausgabeparameter.

entweder einen Ausgabeparameter abzubilden und die Charge mit ExecuteSqlCommand (SQL, params) ausführen oder die Sqlsp Partie wie folgt schreiben:

declare @RETURN_VALUE INT; 
exec @RETURN_VALUE = [dbo].[usp_InsertInspectionEventPublic] @contenttype, @image, @applicationid, @statusid, @notes, @requestuserid, @assigneduserid, @parentid, @eventid, @discipline, @replyby, @workitemid, @messagetype, @inspectionid, @floor; 
SELECT @RETURN_VALUE RETURN_VALUE; 

So dass der Rückgabewert in einem resultset kommt zurück.

+0

Tatsächlich hat die Speicherprozedur keinen Ausgabeparameter deklariert , also kann ich sowas nicht verwenden [dbo]. [usp_InsertInspectionEventPublic] OUT myOutputParameter ... Das linkpad generiert die sql auf diese Weise, wenn es die gespeicherte Prozedur aufruft. Innerhalb der gespeicherten Prozedur gibt es eine Zeile, die das Gleiche macht, was Sie vorschlagen. Geben Sie die ID zurück, nachdem Sie der ID den Wert zugewiesen haben. Entschuldigung dafür, dass das "at" auf den Variablen im Kommentar nicht eingeschlossen ist, scheint, dass diese Eingabe es nicht erlaubt – Heinrich

+0

Es ist kein Ausgabeparameter einer gespeicherten Prozedur, es ist ein Rückgabewert. Deshalb ist es exec @RETURN_VALUE = procname ... 'anstelle von' exec procname @RETURN_VALUE. . . '' return @ id' gibt die Daten als Rückgabewert aus 'select @id id' gibt es als Ergebnismenge zurück, wie SqlQuery erwartet. –

+0

Ich bin verwirrt, meinst du wählen Sie ID = SCOPE_IDENTITY() aus TEMPTABLE Rückgabe ID gibt eine Ergebnismenge zurück? – Heinrich

Verwandte Themen