Получение sqlexception при успешной вставке, VB.NET - PullRequest
0 голосов
/ 24 октября 2008

Я пытаюсь сделать очень простую вставку с использованием VB.NET. По какой-то причине я получаю SqlException при каждой вставке. Данные вставлены, но все равно получают следующее:

Нарушение ограничения PRIMARY KEY 'PK_User'. Невозможно вставить дубликат ключа в объект 'dbo.Employee'. Заявление было прекращено

Когда я проверяю в SQL Management Studio, данные успешно вставляются.

Вот код, где происходит проблема

Try
    conn.Open()
    Dim insertSQL As String = "insert into Employee(uName, firstName, lastName,
        On_Switch, On_Phone) " + "values('" & uName & "', '" & firstName & "', '" _
        & lastName & "', '" & onSwitch & "', '" & onPhone & "')"
        Dim AddCom As SqlCommand = New SqlCommand(insertSQL, conn)

        If (AddCom.ExecuteNonQuery() = 1) Then

            lblError.Text = "User Added."
            ' string urlBack = "../ViewAsset.aspx?DeptID=" + DeptID;
            ' Response.Redirect(urlBack);
        End If

        conn.Close()

    Catch ex As SqlException
        Dim ExMsg As String = ex.Message.ToString()
        lblError.Text = ExMsg

Я вернулся и протестировал тот же код в C #, и исключение не выдается. Кажется, что-то маленькое, что я делаю в VB, но я потерялся в том, что это такое.

Ответы [ 4 ]

7 голосов
/ 24 октября 2008

В качестве примечания я настоятельно рекомендую перейти на параметризованные запросы, чтобы предотвратить риск внедрения SQL-кода, от которого ваш текущий код не защищен.

При возникновении ошибки я хотел бы убедиться, что ваш код не вызывается дважды в версии VB.

3 голосов
/ 24 октября 2008

Две теории. Либо ваш код выполняется дважды, либо в таблице Employee есть триггер, который пытается выполнить вставку после успешной вставки. (Правка: @Mitchel Sellers совершенно прав, если тот же код работает в c #, это абсолютно не проблема триггера.)

Я догадываюсь, что ваш код выполняется дважды. Попробуйте запустить с подключенным отладчиком и установить точку останова в ExecuteNonQuery - я думаю, вы обнаружите, что какой-то другой метод вызывает этот метод несколько раз.

@ Митчел Селлерс - ХОРОШАЯ ЗАХВАТА НА КРЫШЕ SQL-ИНЖЕКЦИИ! Параметры, пожалуйста!

0 голосов
/ 29 октября 2008

Если вы выполняете этот код в каком-либо событии, убедитесь, что вы не подписались на событие несколько раз. У меня была эта проблема в asp.net. Обычно я просто удаляю обработчик события click в коде и атрибут onclick в файле aspx, если он там тоже существует, а затем пробую снова.

0 голосов
/ 25 октября 2008

Как еще одно замечание, я заметил, что ваш код потенциально может оставить соединение SQL открытым. Если вы используете .NET 2.0 framework, вы должны использовать оператор Using. Это гарантирует, что соединения закрыты и удалены, даже если выброшено исключение. Проверьте эту статью на MSDN для более подробной информации: http://msdn.microsoft.com/en-us/library/htd05whh.aspx. Другой вариант - добавить оператор close в блок finally вашего обработчика try-catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...