テーブル値のストアドプロシージャを作成しました。これは挿入された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);
}
int型retunvalue =(INT)command.Parameters [ "MeetingId @"]の値。 これは、コマンドを実行した後に値を取得するのに役立ちますか? – Hybridzz
それは0の値を持っています。だから、残念です。これは簡単なものでなければならないので、私は明白な何かを見逃すはずです。 –
otherRetは通常は影響を受ける行で、@MeetingIdではありません。 'command.Parameters [" @ MeetingId "]。Value'を確認してください。 – Zach