Ключевое изменение, которое вам нужно сделать, это следующая строка SQL из вашей хранимой процедуры:
UPDATE dbo.FG_FILLIN
SET Status='SHIPPED',
DateModified=@Date,
ModifiedBy=@User,
WorkWeek=@WorkWeek
WHERE (Status='KITTED')
AND SerialNumber=@SerialNumber
Вам необходимо вернуть значение, которое позволяет вам определить, уже произошло это ОБНОВЛЕНИЕ или нет, например:
DECLARE @iUpdateAlreadyComplete INT
SET @iUpdateAlreadyComplete = 0;
IF EXISTS
(
SELECT 1
FROM dbo.FG_FILLIN
WHERE Status='SHIPPED'
AND SerialNumber=@SerialNumber
)
BEGIN
SET @iUpdateAlreadyComplete = 1
END
ELSE
BEGIN
UPDATE dbo.FG_FILLIN
SET Status='SHIPPED',
DateModified=@Date,
ModifiedBy=@User,
WorkWeek=@WorkWeek
WHERE (Status='KITTED')
AND SerialNumber=@SerialNumber
END
SELECT @iUpdateAlreadyComplete AS Result
Затем вы можете изменить свой DAL с return cmd.ExecuteNonQuery();
на:
var result = Convert.ToInt32(cmd.ExecuteScalar());
return result;
Возвращаемое значение теперь будет 0
для записи, которая была обновлена, и 1
для записи, которая не нуждалась в обновлении, поскольку она уже была обработана.
Другие заметки
Есть несколько других вещей, которые вы должны рассмотреть, чтобы изменить:
sp_UpdatetoShipped
- это имя bad для хранимой процедуры. Не используйте префикс sp_
.
- Ваш DAL сознательно
catch
es и throw
является исключением (по общему признанию "лучшим" способом), вам действительно нужно?
- Вместо явного вызова
Dipose()
используйте вместо этого синтаксис using() {}
, поскольку это гарантирует, что Dispose()
вызывается даже в случае исключения.
using
синтаксис:
using(SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("sp_UpdatetoShipped", conn))
{
}
}