0

테이블 값 매개 변수 저장 프로 시저를 작성했습니다. 삽입 된 ID를 반환합니다. SSMS 내부의 쿼리에서 실행하면 올바르게 동작합니다.저장 프로 시저에서 반환 값 검색

코드에서 프로 시저를 호출하면 코드가 실행되고 데이터가 삽입되지만 반환 매개 변수가 추가되고 반환 매개 변수로 표시되지 않습니다.

내가 뭘 잘못하고 있니?

SP :

ALTER PROCEDURE [dbo].[InsertUpdateMeeting] 
    -- Add the parameters for the stored procedure here 
    @Meeting MeetingsTableType READONLY, 
    @Area AreasTableType READONLY, 
    @MeetingLocation MeetingLocationsTableType READONLY 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    -- Insert statements for procedure here 
    DECLARE @MeetingId int = 0; 
    DECLARE @AreaId int; 
    DECLARE @MeetingLocationId int; 

    SELECT TOP 1 @MeetingId=m.MeetingId FROM @Meeting AS m; 
    SELECT TOP 1 @MeetingLocationId = ml.MeetingLocationId FROM @MeetingLocation AS ml; 
    SELECT TOP 1 @AreaId = a.AreaId FROM @Area AS a; 

    UPDATE Areas SET 
     Hotline=areaParam.Hotline, 
     Name=areaParam.Name 
    FROM Areas INNER JOIN @Area AS areaParam 
    ON Areas.AreaId=areaParam.AreaId; 
    IF(@@ROWCOUNT=0) 
     BEGIN; 
      INSERT INTO Areas 
       (Hotline,Name) 
      SELECT areaParam.Hotline,areaParam.Name FROM @Area AS areaParam; 
      SET @AreaId=SCOPE_IDENTITY(); 
     END; 
    UPDATE MeetingLocations SET 
     Address1=ml.Address1, 
     Address2=ml.Address2, 
     Address3=ml.Address3, 
     City=ml.City, 
     [State]=ml.[State], 
     Zip=ml.Zip, 
     ClubName=ml.ClubName, 
     ClubDescription=ml.ClubDescription, 
     MapLink=ml.MapLink 
    FROM MeetingLocations INNER JOIN @MeetingLocation AS ml 
    ON MeetingLocations.MeetingLocationId=ml.MeetingLocationId; 
    IF(@@ROWCOUNT=0) 
     BEGIN; 
      INSERT INTO MeetingLocations 
       (Address1,Address2,Address3,City,[State],Zip,ClubName,ClubDescription,MapLink) 
      SELECT ml.Address1,ml.Address2,ml.Address3,ml.City,ml.[State],ml.Zip,ml.ClubName,ml.ClubDescription,ml.MapLink 
      FROM @MeetingLocation AS ml; 
      SET @MeetingLocationId=SCOPE_IDENTITY(); 
     END; 
    UPDATE Meetings SET 
     AreaId = @AreaId, 
     [email protected], 
     Name = meetingParam.Name 
    FROM Meetings INNER JOIN @Meeting AS meetingParam 
    ON Meetings.MeetingId=meetingParam.MeetingId; 
    IF(@@ROWCOUNT=0) 
     BEGIN; 
      INSERT INTO Meetings 
       (MeetingLocationId,AreaId,Name) 
      SELECT @MeetingLocationId,@AreaId,meetingParam.Name FROM @Meeting AS meetingParam; 
      SET @MeetingId=SCOPE_IDENTITY(); 
     END; 
    RETURN @MeetingId; 
END 

C# 코드 : 당신은 반환 값을 catpure, 또는 output 매개 변수를 사용하여 ExecuteScalar을 사용하거나 필요

...create tables... 
var meetingLocationParam = new SqlParameter("@MeetingLocation", meetingLocationTable); 
meetingLocationParam.SqlDbType = SqlDbType.Structured; 
meetingLocationParam.TypeName = "MeetingLocationsTableType"; 
var meetingParam = new SqlParameter("@Meeting", meetingTable); 
meetingParam.SqlDbType = SqlDbType.Structured; 
meetingParam.TypeName = "MeetingsTableType"; 
var areaParam = new SqlParameter("@Area", areaTable); 
areaParam.TypeName = "AreasTableType"; 
areaParam.SqlDbType = SqlDbType.Structured; 
using (var connection = new SqlConnection(conn.ConnectionString)) 
using (var command = new SqlCommand()) 
{ 
    connection.Open(); 
    command.Connection = connection; 
    command.CommandText = "EXEC dbo.InsertUpdateMeeting"; 
    command.Parameters.AddRange(new SqlParameter[] 
    {meetingParam, areaParam, meetingLocationParam, new SqlParameter() 
    { 
     Value=0, 
     Direction=ParameterDirection.ReturnValue, 
     SqlDbType=SqlDbType.Int, 
     ParameterName="@MeetingId" 
    } }); 
    var otherRet = command.ExecuteNonQuery(); 

    //Assert.IsTrue(ret > 0); 
} 
+0

INT의 retunvalue = (int)를 command.Parameters를 [ "@ MeetingId"] 값;. 명령을 실행 한 후이 값을 검색하는 데 도움이됩니까? – Hybridzz

+0

값은 0입니다. 불행히도. 이것이 분명해야하기 때문에 나는 명백한 것을 놓치고 있어야합니다. –

+0

otherRet은 일반적으로 영향을받는 행이며 @MeetingId는 아닙니다. 그냥'command.Parameters [ "@ MeetingId"] .Value를 확인하십시오. – Zach

답변

2

출력 값은 ExecuteNonQuery에서 반환되지 않습니다. 이 같은 수익 매개 변수에 대한 참조를 만들어보십시오 : 당신은 또한 변경 될 수 있습니다

var myReturnedValue = returnParameter.Value; 

, 실행 한 후 다음

var returnParameter = new SqlParameter[] 
{meetingParam, areaParam, meetingLocationParam, new SqlParameter() 
{ 
    Value=0, 
    Direction=ParameterDirection.ReturnValue, 
    SqlDbType=SqlDbType.Int, 
    ParameterName="@MeetingId" 
} } 

command.Parameters.Add(returnParameter); 

RETURN @MeetingId; 

SELECT @MeetingId; 
,

후 사용

ADO.NET을 사용하여 저장 프로 시저에서 반환 값을 얻을 수있는 여러 가지 방법이 있습니다
var myReturnedValue = (int)command.ExecuteScalar(); 
+0

ExecuteNonQuery는 -1을 반환하지만 반환 매개 변수 i add에 대한 참조는 0 인 값을 갖습니다. 이는 내 sp에서 삽입되었거나 반환 된 ID가 아닙니다. –

+0

코드에 표시되지 않습니다. 매개 변수의 값을 어디에서 확인하고 있습니까? –

+1

값을 반환하는 대신 값을 선택하는 것이 더 쉽습니다. 그리고 값을 검색하기 위해'ExecuteScalar'를 사용하는 것이 더 쉽습니다. –

0

.

이 게시물에는 비슷한 질문이 답변되었습니다. Calling stored procedure with return value

+0

링크를 가져 주셔서 감사합니다, 불행히도, 나는 그것을 보았고 내 문제를 해결하지 못했습니다. 반환 매개 변수의 값은 0입니다. SP가 반환하는 것은 아닙니다. 출력 매개 변수를 사용해 보겠습니다. –

0

.

예제는 이전에 사용했던 일반적인 방법입니다. 저장 프로 시저 또는 텍스트를 사용하여 SQL 명령을 전달할 수 있습니다.

  1. SqlAdapter

    /// <summary> 
    /// Returns a DataSet given an Sql Command 
    /// </summary> 
    /// <param name="cmd">The SqlCommand object</param> 
    /// <returns>DataSet</returns> 
    public static DataSet GetDataSet(SqlCommand cmd) 
    { 
        using (SqlConnection con = DbConnect()) // DbConnect() returns SqlConnection instance 
        { 
         DataSet ds = new DataSet(); 
         SqlDataAdapter da = new SqlDataAdapter(cmd); 
         cmd.Connection = con; 
         da.Fill(ds, "my_dataset"); 
    
         return ds; 
        } 
    } 
    
  2. ExecuteScalar는

    /// <summary> 
    /// Returns a single value from the database given an Sql Command object 
    /// </summary> 
    /// <param name="cmd">The Sql Command object</param> 
    /// <returns>string</returns> 
    public static string GetSingleFromDatabase(SqlCommand cmd) 
    { 
        using (SqlConnection con = DbConnect()) // DbConnect() returns SqlConnection instance 
        { 
         cmd.Connection = con; 
    
         try 
         { 
          object returnedValue = cmd.ExecuteScalar(); 
          if (returnedValue != null) 
          { 
           return returnedValue.ToString(); 
          } 
          else 
           return ""; 
         } 
         catch (Exception) 
         { 
          throw; 
         } 
        } 
    } 
    
+0

ExecuteScalar에서 반환 된 값이 null이고 returnParameter의 값이 0입니다. –

+0

@MichaelBillingham 그러면 저장 프로 시저가 반환 된 null과 동일한 매개 변수를 사용하여 실제로 값을 반환하는지 확인하고 확인해야합니다. SQL Server에서 확인하십시오. –

0
난 그냥 당신이 당신의 SP 정의에 @MeetingId 매개 변수를 선언하지 않았다 발견

(당신이 몸에했지만 나는 그것이 사용될 수 있다고 생각하지 않는다).

ALTER PROCEDURE [dbo].[InsertUpdateMeeting] 
    -- Add the parameters for the stored procedure here 
    @Meeting MeetingsTableType READONLY, 
    @Area AreasTableType READONLY, 
    @MeetingLocation MeetingLocationsTableType READONLY, 
    @MeetingId <datatype> OUTPUT -- ADD THIS 
AS 

그런 다음 코드에서 당신이 그것을 잡을 수

command.Parameters["@MeetingId"].Value 
관련 문제