我正在尝试使用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中做的小事,但我已经迷失了它是什么。
答案 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属性(如果它也存在),然后再次尝试。