在成功插入VB.NET时获得sqlexception

时间:2008-10-24 15:52:28

标签: c# sql vb.net

我正在尝试使用VB.NET进行一个非常简单的INSERT。出于某种原因,我在每个插件上都遇到了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 个答案:

答案 0 :(得分:7)

作为旁注,我强烈建议您更改参数化查询,以防止SQL注入的风险,即您当前的代码不受保护。

对于错误问题,我会检查您的代码是否在VB版本中没有被调用两次。

答案 1 :(得分:3)

两种理论。您的代码要么被执行两次,要么在成功插入后尝试插入的Employee表上有一个触发器。 (编辑:@Mitchel Sellers是完全正确的,如果相同的代码在c#中工作,那绝对不是触发器问题。)

我的预感是您的代码正在执行两次。尝试运行附加的调试器和ExecuteNonQuery上设置的断点 - 我想你会发现其他一些方法多次调用这个方法。

@Mitchel卖家 - 关于SQL注入BUG的好消息!请参数!

答案 2 :(得分:0)

另一方面,我注意到你的代码可能会打开一个sql连接。如果您使用的是.NET 2.0框架,则应使用Using语句。即使抛出异常,它也可确保关闭和处理连接。有关更多详细信息,请查看MSDN上的这篇文章:http://msdn.microsoft.com/en-us/library/htd05whh.aspx。另一种选择是在try-catch处理程序的Finally块中添加close语句。

答案 3 :(得分:0)

如果您在某种事件中执行此代码,请确保您没有多次订阅该事件。我在asp.net中遇到过这个问题。通常我只删除后面代码中的click事件处理程序和aspx文件中的onclick属性(如果它也存在),然后再次尝试。