1

context.Databaseを使用して、レコードを挿入してIDを返すストアドプロシージャを実行しようとしています。私は、出力パラメータ、選択、または戻り値のいずれかを使用して私のprocの作品を知っていますが、ExecuteSqlCommandまたはSqlQuery<int>を返すことができません。 、EF 4.1コードファースト:ストアドプロシージャを実行してIDENTを返します

INSERT INTO TableA (FieldA, FieldB) 
RETURN SCOPE_IDENTITY 

をリターンしてストアドプロシージャを使用して

私はSSMS

DECLARE @return_value int 
EXEC @return_value = spInsertRecord 
SELECT 'Return Value' = @return_value 

から1010966の戻り値を参照してくださいしかし、私は自分のアプリケーションで行われているものは何も有効な値を返しません。

Int64 result = context.Database.ExecuteSqlCommand 

は常に3を返し、私はSqlQuery<int>を使用するときに小数点を参照キャストエラーが発生します。 私は、出力パラメータを持つ試みをしたが、正しく実行するコードを取得することができませんでしたので、保存中に含まれるロジックを置き換えるためにモデルを作成するSELECT SCOPE_IDENTITYまたはRETURN SCOPE_IDENTITY

ショートのいずれかを消費するアプリに焦点を当てていますプロシージャでは、Stored Procとアプリケーションレベルの両方の値を返すためのすべての提案を公開しています。

答えて

1

これをどのように機能させるかは次のとおりです。この例では、EntityManagerはDBContextを継承するクラスに過ぎません。

試験表:

CREATE TABLE [dbo].[TableA](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [FieldA] [nvarchar](50) NULL, 
    [FieldB] [nvarchar](50) NULL 
) ON [PRIMARY] 

ストアドプロシージャ:

CREATE PROC spInsertRecord 
    @FieldA NVARCHAR(50), 
    @FieldB NVARCHAR(50) 
AS 

INSERT TableA 
    (FieldA, FieldB) 
VALUES 
    (@FieldA, @FieldB) 

SELECT CAST(@@IDENTITY AS INT) 

呼び出すコード(VB.NET)

Public Shared Function AddRecord(FieldA As String, FieldB As String) As Integer 
    Try 
     Using EM As New EntityManager 
      Return EM.Database.SqlQuery(Of Integer)(
       "EXEC spInsertRecord @FieldA, @FieldB", 
       New SqlParameter("FieldA", FieldA), 
       New SqlParameter("FieldB", FieldB)).SingleOrDefault 
     End Using 
    Catch ex As Exception 
     Throw New ApplicationException("An error occurred while executing AddRecord", ex) 
    End Try 
End Function 

消費コード:

Return AddRecord("Tom", "Halladay") 

私の結果は、戻り値の増加です。お役に立てれば。

関連する問題