2016-08-26 16 views
0

C#ExecuteSqlCommandがストアドプロシージャからの出力を返していません。C#ExecuteSqlCommandがストアドプロシージャからの出力を返さない

私は実際に最後に挿入された行のは、ここでId

が、私はこのストアドproceedureをテストしてきたし、それがSQL Server Management Studioの

に完璧に働いている私のストアドProceedure

ALTER PROCEDURE [dbo].[PatientInsert] 
@FirstName nvarchar(Max), 
@MiddleName nvarchar(Max), 
@LastName nvarchar(Max), 
@Gender nvarchar(Max), 
@CNICNumber nvarchar(Max), 
@DateOfBirth datetime, 
@Country nvarchar(max), 
@StateOrProvince nvarchar(max), 
@City nvarchar(max), 
@Address nvarchar(max), 
@CellNumber nvarchar(max), 
@TelephoneNumber nvarchar(max), 
@Email nvarchar(max), 
@NOKFirstName nvarchar(max), 
@NOKLastName nvarchar(max), 
@NOKRelation nvarchar(max), 
@NOKCNICNumber nvarchar(max), 
@NOKCellNumber nvarchar(max), 
@Title int, 
@PicturePath nvarchar(max), 
@LastCreatedId INT OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON 

INSERT INTO [dbo].[Patients] 
      ([FirstName] 
      ,[MiddleName] 
      ,[LastName] 
      ,[Gender] 
      ,[CNICNumber] 
      ,[DateOfBirth] 
      ,[Country] 
      ,[StateOrProvince] 
      ,[City] 
      ,[Address] 
      ,[CellNumber] 
      ,[TelephoneNumber] 
      ,[Email] 
      ,[NOKFirstName] 
      ,[NOKLastName] 
      ,[NOKRelation] 
      ,[NOKCNICNumber] 
      ,[NOKCellNumber] 
      ,[Title] 
      ,[PicturePath]) 

    VALUES 
      (
      @FirstName , 
      @MiddleName , 
      @LastName , 
      @Gender , 
      @CNICNumber , 
      @DateOfBirth, 
      @Country , 
      @StateOrProvince , 
      @City , 
      @Address , 
      @CellNumber , 
      @TelephoneNumber , 
      @Email , 
      @NOKFirstName , 
      @NOKLastName , 
      @NOKRelation , 
      @NOKCNICNumber , 
      @NOKCellNumber , 
      @Title, 
      @PicturePath 
     ) 

     SELECT @LastCreatedId = SCOPE_IDENTITY() 

END 

です。ここStored Procedure Execution Imageはです必要SCOPE_IDENTITY()を使用しているので、OUTPUT@LastCreatedId

として返しますあなたは imageデータで見ることができます0

はデータベースに完全に挿入されているが、C#で、私は、データベースにデータを正しく送信することができますが、@LastCreatedId

そして、ここでのOUTPUTデータ保持することができない私のC#のコードは、このストアドプロシージャ

を使用することです
public int PatientInsert(Patient PatientInstance) 
     { 
      using (var context = new HMContext()) 
      { 
       try 
       { 

        //Int32 LastCreatedId = new Int32(); 

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

        insertRow = 
        context.Database.ExecuteSqlCommand("PatientInsert @FirstName ,@MiddleName," 
        +"@LastName,@Gender,@CNICNumber,@DateOfBirth,@Country,@StateOrProvince,@City," 
        + "@Address,@CellNumber,@TelephoneNumber,@Email,@NOKFirstName,@NOKLastName,@NOKRelation," 
        + "@NOKCNICNumber,@NOKCellNumber,@Title,@PicturePath,@LastCreatedId", 
        new SqlParameter("@FirstName", PatientInstance.FirstName), 
        new SqlParameter("@MiddleName", PatientInstance.MiddleName), 
        new SqlParameter("@LastName", PatientInstance.LastName), 
        new SqlParameter("@Gender", PatientInstance.Gender), 
        new SqlParameter("@CNICNumber", PatientInstance.CNICNumber), 
        new SqlParameter("@DateOfBirth", PatientInstance.DateOfBirth.Value.ToShortDateString()), 
        new SqlParameter("@Country", PatientInstance.Country), 
        new SqlParameter("@StateOrProvince", PatientInstance.StateOrProvince), 
        new SqlParameter("@City", PatientInstance.City), 
        new SqlParameter("@Address", PatientInstance.Address), 
        new SqlParameter("@CellNumber", PatientInstance.CellNumber), 
        new SqlParameter("@TelephoneNumber", PatientInstance.TelephoneNumber), 
        new SqlParameter("@Email", PatientInstance.Email), 
        new SqlParameter("@NOKFirstName", PatientInstance.NOKFirstName), 
        new SqlParameter("@NOKLastName", PatientInstance.NOKLastName), 
        new SqlParameter("@NOKRelation", PatientInstance.NOKRelation), 
        new SqlParameter("@NOKCNICNumber", PatientInstance.NOKCNICNumber), 
        new SqlParameter("@NOKCellNumber", PatientInstance.NOKCellNumber), 
        new SqlParameter("@Title", PatientInstance.Title.ToString()), 
        new SqlParameter("@PicturePath", (PatientInstance.PicturePath==null?"":PatientInstance.PicturePath)), 
        returnCode 
        ); 
        return (int)returnCode.Value; 
       } 
       catch (Exception exp) 
       { 
        var me = exp.Message; 
        return -1; 
       } 
      } 
     } 

私はreturnCode.Value から{}値を取得し、私はそれを整数にキャストしようとした場合、それは私に例外Specified cast is not valid.何SH

を与えます私はおそらくちょうどストアドプロシージャ内

SELECT @LastCreatedId = CAST(SCOPE_IDENTITY() as int) 

を追加するストアドプロシージャ

+1

あなたは'Database.ExecuteSqlCommand'ではなく' Database.ExecuteReader'が必要です – Tibrogargan

答えて

1

からの出力値として@LastCreatedIdの値を取得するために行うウルドは..また、それが

以下のキャスト操作を使用して、int型の値が含まれているチェックしますか
if (returnCode.Value != DBNull.Value) 
return Convert.ToInt32(returnCode.Value); 
1

基本的にはSCOPE_IDENTITY()経由でIDを取得しようとしているので、使用しないでください:ExecuteScalar()

クエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます。

私は下のポストからの回答をした: Return value from SQL Server Insert command using c#

乾杯を!

+1

このリンクは質問に答えるかもしれませんが、ここでは答えの重要な部分を含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 – Squazz

1

私はパラメータがあなたの完全なコードは次のようになります。この

context.Database.ExecuteSqlCommand("...,@LastCreatedId OUTPUT",... 

ようExecuteSQLCommandコールで言及された後、ワードOUTPUTを追加してみてください、同じ問題を持っていた:おそらく

public int PatientInsert(Patient PatientInstance) 
    { 
     using (var context = new HMContext()) 
     { 
      try 
      { 

       //Int32 LastCreatedId = new Int32(); 

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

       insertRow = 
       context.Database.ExecuteSqlCommand("PatientInsert @FirstName ,@MiddleName," 
       +"@LastName,@Gender,@CNICNumber,@DateOfBirth,@Country,@StateOrProvince,@City," 
       + "@Address,@CellNumber,@TelephoneNumber,@Email,@NOKFirstName,@NOKLastName,@NOKRelation," 
       + "@NOKCNICNumber,@NOKCellNumber,@Title,@PicturePath,@LastCreatedId OUTPUT", 
       new SqlParameter("@FirstName", PatientInstance.FirstName), 
       new SqlParameter("@MiddleName", PatientInstance.MiddleName), 
       new SqlParameter("@LastName", PatientInstance.LastName), 
       new SqlParameter("@Gender", PatientInstance.Gender), 
       new SqlParameter("@CNICNumber", PatientInstance.CNICNumber), 
       new SqlParameter("@DateOfBirth", PatientInstance.DateOfBirth.Value.ToShortDateString()), 
       new SqlParameter("@Country", PatientInstance.Country), 
       new SqlParameter("@StateOrProvince", PatientInstance.StateOrProvince), 
       new SqlParameter("@City", PatientInstance.City), 
       new SqlParameter("@Address", PatientInstance.Address), 
       new SqlParameter("@CellNumber", PatientInstance.CellNumber), 
       new SqlParameter("@TelephoneNumber", PatientInstance.TelephoneNumber), 
       new SqlParameter("@Email", PatientInstance.Email), 
       new SqlParameter("@NOKFirstName", PatientInstance.NOKFirstName), 
       new SqlParameter("@NOKLastName", PatientInstance.NOKLastName), 
       new SqlParameter("@NOKRelation", PatientInstance.NOKRelation), 
       new SqlParameter("@NOKCNICNumber", PatientInstance.NOKCNICNumber), 
       new SqlParameter("@NOKCellNumber", PatientInstance.NOKCellNumber), 
       new SqlParameter("@Title", PatientInstance.Title.ToString()), 
       new SqlParameter("@PicturePath", (PatientInstance.PicturePath==null?"":PatientInstance.PicturePath)), 
       returnCode 
       ); 
       return (int)returnCode.Value; 
      } 
      catch (Exception exp) 
      { 
       var me = exp.Message; 
       return -1; 
      } 
     } 
    } 
関連する問題