ストアドプロシージャから挿入または更新されたIDを取得しようとしていますが、2つの異なる方法を試しました
If exists(select ....)
パフォーマンス上の理由で使用できません
1-OUTPUTを使用する
@firstName varchar(30),
@Telephone int
AS
BEGIN transaction
UPDATE [PHONE_BOOK].[dbo].[USER]
SET TELEPHONE= @Telephone
output inserted.USERID
where FIRST_NAME = @firstName
if @@ROWCOUNT = 0
begin
INSERT INTO [PHONE_BOOK].[dbo].[USER]
([FIRST_NAME]
,[TELEPHONE])
output inserted.USERID -- or output SCOPE_IDENTITY()
VALUES
(@firstName
,@Telephone)
end
C#コード
IList<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@firstName", "Mike"));
parameters.Add(new SqlParameter("@Telephone", 9514256));
using (var sqlConnection = new SqlConnection(Config.ConnString))
{
sqlConnection.Open();
using (SqlCommand command = sqlConnection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "[dbo].[INSET_USER]";
command.UpdatedRowSource = UpdateRowSource.None;
foreach (SqlParameter oPar in parameters)
command.Parameters.Add(oPar);
object x = command.ExecuteScalar();
}
}
- 更新の場合==>
x
は正しい - 削除の場合==>
x
はnullです
2-OUTPUTパラメーターを使用する
@firstName varchar(30),
@Telephone int,
@userId int output
AS
BEGIN transaction
UPDATE [PHONE_BOOK].[dbo].[USER]
SET TELEPHONE= @Telephone
where FIRST_NAME = @firstName
-- i can't find different way to set @userId than doing a select which is not acceptable
if @@ROWCOUNT = 0
begin
INSERT INTO [PHONE_BOOK].[dbo].[USER]
([FIRST_NAME]
,[TELEPHONE])
VALUES
(@firstName
,@Telephone)
set @userId = SCOPE_IDENTITY()
end
c#コード:
IList<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("@firstName", "Mike"));
parameters.Add(new SqlParameter("@Telephone", 9514256));
using (var sqlConnection = new SqlConnection(Config.ConnString))
{
sqlConnection.Open();
using (SqlCommand command = sqlConnection.CreateCommand())
{
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "[dbo].[INSET_USER]";
command.UpdatedRowSource = UpdateRowSource.None;
foreach (SqlParameter oPar in parameters)
command.Parameters.Add(oPar);
command.Parameters.Add("@userId",0).Direction = ParameterDirection.Output;
command.ExecuteNonQuery();
var x = command.Parameters["@userId"].Value;
}
}
- 更新の場合==>
x
は-1です - 削除の場合==>
x
は正しい
どうすればこれを修正できますか?ストアドプロシージャに出力パラメータを渡す必要がないため、最初のオプションをお勧めします