2017-09-14 12 views
1

を呼び出すときに、私は次のようにEntity Frameworkのからストアドプロシージャを呼び出すためにしようとしているEntity Frameworkのを使用して失敗したから整数の結果を取得します。エラー:LinqPadでストアドプロシージャがContext.Database.SqlQuery <int>

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

あなたはストアドプロシージャが

enter image description here

を働いていることがわかります私もこれを試み

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

SQLで同じ呼に対するLinqPadから生成されたコードは以下

-- 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 

ストアドプロシージャは、常に次のようにIDを返すある

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; 

しかし、私はそのアプローチで別のエラーが発生しています:コマンドを実行するとき、paramerte rsは排他的にデータベースのパラメータまたは値でなければなりません。 ここで問題がありますか?

+0

戻り値は結果セットとは異なります。 SqlQueryは結果セットを返します。私はよく知られているわけではありませんが、 'params'の方向(' 'ReturnValue'')でパラメータにアクセスすることができます(これはキーワードなので使わないでください) – Crowcoder

答えて

0

SqlQuery<T>()は出力パラメータではなく、結果セットを探しています。

出力パラメータをマッピングしExecuteSqlCommand(SQL、のparams)でバッチを実行、またはこのようsqlSPバッチを作成する次のいずれかの戻り値が結果セットに戻ってくるように

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; 

+0

実際にはストアプロシージャには出力パラメータが宣言されていませんしたがって、私は[dbo]のようなものを使うことができません。[usp_InsertInspectionEventPublic] OUT myOutputParameter ...ストアドプロシージャを呼び出すときに、リンクパッドがSQLをそのように生成しています。ストアドプロシージャの内部には、idに値を代入した後にReturn idを提案する行と同じ行があります。コメントの変数に "at"を含めないと申し訳ありませんが、この入力は許可されていないようです – Heinrich

+0

これはストアドプロシージャの出力パラメータではなく、戻り値です。だから、 'exec procname @ RETURN_VALUEの代わりに' exec @ RETURN_VALUE = procname ... 'があります。 。 'return @ id'はデータを戻り値として出力します。select @ id id'はSqlQueryのように結果セットとして返します。 expects。私は混乱しています –

+0

は、あなたがTEMPTABLE 戻りID 戻ってから 。SELECT ID = SCOPE_IDENTITY()ResultSetを意味するのですか? – Heinrich

関連する問題