Я думаю, что это из-за этого:
If feature.Selected Then
...
Else
....
End If
Это означает, что для каждого элемента в списке флажков он всегда будет идти в блок Else, когда флажок не установлен, что вызывает многократные вставки.
Дополнительные предложения
Не смешивайте свой код пользовательского интерфейса и код доступа к данным на одном и том же классе / странице.Хорошей практикой является отделение пользовательского интерфейса от бизнес-логики от логики доступа к данным.Например, этот код:
Dim strSQL As String = "INSERT INTO Marketing (ProductID,
MarketingTypeID, MarketingTitle, MarketingData)
VALUES (@ProductID, 3, 'Feature', @MarketingData);
UPDATE Product SET ModifyDate = getdate(),
ModifyUser = @ModifyUser
WHERE ProductID = @ProductID"
Using cn As New SqlConnection
(System.Configuration.ConfigurationManager.ConnectionStrings
("LocalSqlServer").ConnectionString)
Using cmd As New SqlCommand(strSQL, cn)
cmd.Parameters.Add(New SqlParameter("@ProductID",
ProductID.Value))
cmd.Parameters.Add(New
SqlParameter("@MarketingData", feature.Value))
cmd.Parameters.Add(New SqlParameter("@ModifyUser",
System.Web.HttpContext.Current.User.Identity.Name))
cn.Open()
cmd.ExecuteNonQuery()
End Using
cn.Close()
End Using
Может быть полностью перемещен в другой класс, который получает 3 параметра: UserID
, ProductID
и MarketingData
.Делая это, вы можете использовать его в других местах (например, на страницах) вместо того, чтобы повторять логику снова и снова.
Оптимально, у вас должен быть бизнес-уровень, который вызывает ваш уровень доступа к данным (вышеупомянутый код войдет в ваш уровень доступа к данным), но по крайней мере перемещение этого кода в другое место является хорошим началом.Еще одно преимущество, помимо возможности повторного использования вашего кода, состоит в том, что, предположив, что вы обнаружили ошибку в этой подпрограмме, вы можете исправить ее в одном месте, а не в других местах приложения, чтобы исправить ошибку.