1

レガシーアプリケーションで作業していますが、整数を返すストアドプロシージャマッピングエラーが発生しています。エラー自体はこの1つである:Entity Frameworkでストアドプロシージャの出力パラメータを取得する際にマッピングエラーが発生する:データリーダーが指定した値と互換性がありません

The data reader is incompatible with the specified IF_Insert_Incidents_Citizen'. A member of the type, 'intID', does not have a corresponding column in the data reader with the same name.

私は、Entity Frameworkは_variable@variableで始まるすべての名前を変換することを知って、_intIdに名前を変更しようとしました。

奇妙なことは、私はLinqPadを使用してストアドプロシージャへの呼び出しを行う作る場合、私はこれがストアドプロシージャである@intID

enter image description here

enter image description here

の正しい値を取得することです。

CREATE PROCEDURE [dbo].[IF_Insert_Incidents_Citizen] 
    @chvFolio varchar(50), 
    @chvOwner_Name varchar(100), 
    @chvOwner_Address varchar(100), 
    @dtsDate_Created smalldatetime, 
    @intUser_ID integer, 
    @chvDescription varchar(250), 
    @chvEmail varchar(50), 
    @intIncident_Type_ID integer, 
    @intIncident_Status integer, 
    @intID int Output 
AS 
    SET nocount on 

    DECLARE @intErrorCode INT 
    DECLARE @intApp_ID INT 

    SELECT @intIncident_Type_ID = CAST(Param_Value AS INT) 
    FROM IF_Parameters 
    WHERE Param_Name = 'Citizen_Incident_Type_ID' 

    BEGIN 
     --Get an application id 
     INSERT INTO MasterApplication (DateCreated) 
     VALUES (getdate()) 

     SELECT @intApp_ID = SCOPE_IDENTITY() 

     INSERT INTO IF_Incidents 
     (
      Folio, 
      Owner_Name, 
      Owner_Address, 
      Date_Created, 
      User_ID, 
      Description, 
      Incident_Type_ID, 
      Incident_Status, 
      App_ID 
     ) 
     VALUES 
     (
      @chvFolio, 
      @chvOwner_Name, 
      @chvOwner_Address, 
      @dtsDate_Created, 
      @intUser_ID, 
      @chvDescription , 
      @intIncident_Type_ID, 
      @intIncident_Status, 
      @intApp_ID 
     ) 
     Select @intErrorCode = @@Error, @intID = SCOPE_IDENTITY() 

     --Insert Complaint 
     INSERT INTO IF_Complaints 
     (
      Incident_ID, 
      Complainant_ID, 
      Description , 
      User_ID, 
      Officer_Assigned_ID, 
      Complaint_Status_ID, 
      Date_Made, 
      Email_Complainant 
     ) 
     VALUES 
     (
      @intID, 
      Null, 
      @chvDescription + ' at ' + @chvOwner_Address, 
      1, 
      1, 
      1, 
      @dtsDate_Created , 
      @chvEmail 
     ) 
     Select @intErrorCode = @@Error--, @intID = SCOPE_IDENTITY() 
    End 

    Return @intErrorCode 

ストアドプロシージャでわかるように、intIdは常にin

//class with just the return value 
public class IF_Insert_Incidents_Citizen 
{ 
    public int? intID { get; set; } 
} 

ここで私が得る

var bptRep = DependencyFactory.GetDependency<ICetRepository<IF_Insert_Incidents_Citizen>>(); 
var parameters = GetIfInsertIncidentsCitizenParamenters(); 
var res = bptRep.GetAllFromStoredProcedure(storedProcedure, parameters); 

リポジトリの使用このクラス:私はEntity Frameworkのに以下の方法を使用して、私のストアドプロシージャを呼び出すためにしようとしています今

SCOPE_IDENTITY()を呼び出し、挿入した後cremental値、ストアドプロシージャのすべてのパラメータ

private IEnumerable<SqlParameter> GetIfInsertIncidentsCitizenParamenters() 
{ 
     // Create Parameters 
     var parameters = new List<SqlParameter>(); 

     var param1 = CreateSqlParameter("@chvFolio", SqlDbType.NVarChar, ParameterDirection.Input, criteria["chvFolio"].Value, 50); 

     parameters.Add(param1); 

      .... 

     var paramX = CreateSqlParameter("@intIncident_Status", SqlDbType.Int, ParameterDirection.Input, 10); 
     parameters.Add(paramX); 

     var outparam = CreateSqlParameter("@intID", SqlDbType.Int, ParameterDirection.InputOutput, DBNull.Value); 
     parameters.Add(outparam); 
} 

public IQueryable<TEntity>GetAllFromStoredProcedure(string storedProcedure, IEnumerable<SqlParameter> parameters) 
{ 
    var result = Context.Database.SqlQuery<TEntity>(storedProcedure, parameters).AsQueryable();  
    return result; 
} 

私が提案し@GertArnoldが、まだ動作していないアプローチを踏襲し、これは私のパラメータおよびコード

enter image description here

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

var sql = "exec IF_Insert_Incidents_Citizen @chvFolio, @chvOwner_Name, @chvOwner_Address, @dtsDate_Created, @intUser_ID, @chvDescription, @chvEmail, @intIncident_Type_ID, @intIncident_Status, @intID OUT"; 

var data = ctx.Database.SqlQuery<object>(sql, returnCode, parameters); 

var result = data.FirstOrDefault(); 
+1

ルックをIEnumerableまたはIListのコレクションを渡すのではなく、パラメータに.ToArrayメソッドを呼び出すことに注意してくださいを(https://でのstackoverflow .com/a/33263793/861716) –

+0

@GertArnold私はそこからアプローチをテストしていますが、まだ失敗しているので何かが足りなくなっています。私はストアプロシージャの呼び出しでOUTを紹介し、その1つを試して、私は井戸としてReturnCodeを入れて、動作していない、私は別のエラーが出ている – Heinrich

答えて

1

あなたがこれを読んでいない場合は最後に、正しい方向に私を置く@GertArnoldありますポストは、それを行うあなたに私はちょうどexecの呼び出しに私の@intId OUTに追加Stored procedures with output parameters using SqlQuery in the DbContext API

多くの時間を節約しますしてください、RETURNCODE変数を作成して呼び出す必要はありませんexec @ReturnCode = ....

var returnCode = new SqlParameter("@ReturnCode", SqlDbType.Int); 
returnCode.Direction = ParameterDirection.Output; 
私のコードは、最終的にはこのようになります

、[この]でメソッドに

var sql = "exec IF_Insert_Incidents_Citizen @chvFolio, @chvOwner_Name, @chvOwner_Address, @dtsDate_Created, @intUser_ID, @chvDescription, @chvEmail, @intIncident_Type_ID, @intIncident_Status, @intID OUT"; 

var data = ctx.Database.SqlQuery<object>(sql, returnCode, parameters.ToArray()); 

var result = data.FirstOrDefault(); 
関連する問題