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#コード:

...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 returnParameter = new SqlParameter[] 
{meetingParam, areaParam, meetingLocationParam, new SqlParameter() 
{ 
    Value=0, 
    Direction=ParameterDirection.ReturnValue, 
    SqlDbType=SqlDbType.Int, 
    ParameterName="@MeetingId" 
} } 

command.Parameters.Add(returnParameter); 

その後、

var myReturnedValue = returnParameter.Value; 

を実行した後、あなたはまた、

SELECT @MeetingId; 

RETURN @MeetingId; 

を変更することができますその後、

とADO.NETを使用してストアドプロシージャからの戻り値を取得するために複数の方法があります

var myReturnedValue = (int)command.ExecuteScalar(); 
+0

ExecuteNonQueryは-1を返しますが、戻り値パラメータi addへの参照には、値0があります。これは、spから挿入または返されたIDではありません。 –

+0

あなたのコードには表示されません。パラメータの値はどこで確認していますか? –

+1

値を返すのではなく、単に値を選択してから、 'ExecuteScalar'を使って値を取得する方が簡単かもしれません。 –

0

あなたが返された値をcatpureするExecuteScalarを使用するか、またはoutputパラメータを使用するか必要があります。

この投稿には回答がありませんでした。 Calling stored procedure with return value

+0

リンクをありがとうございます、残念ながら、私はそれを見て、それは私のproblem.Theの値を解決していない戻り値は0です。出力パラメータを試してみよう。 –

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 
関連する問題