我正在使用ms sql-server 2015在vb.net中使用Visual Studio 2015社区版和编程。我已经在表单加载事件中设置了数据适配器和数据表。 (见下文) 私有m_DABinders作为新的SqlDataAdapter 私有m_CBBinders作为新的SqlCommandBuilder Private m_DataTableBinders As New Data.DataTable
我使用下面的代码在Binders表中插入一行,并检查并处理重复键问题。这很好用。当我收到此错误后,我的问题出现了,我将键值更改为唯一的值并尝试再次添加行,我仍然得到相同的重复键错误,奇怪的是,它显示原始的重复键值而不是新的那一个。 (我已经使用MessageBox来确保将更新的键值放入相应的列中。)它的行为就像它在插入更新的行之前仍然试图插入带有重复键的行一样。
在出错之后,我是否必须以某种方式从数据适配器或数据表中删除“坏”行?我注意到,通过执行行计数,每次出现此错误时数据表上的行都会增加1,所以我想我必须以某种方式删除它,但我不确定如何。
我对使用vb.net和ms sql-server进行编程非常陌生,所以请不要在回复中承担太多的先验知识。感谢。
这是我用来插入行的子例程。 Public Sub CreateBinderRow()
Try
Dim keyValueBinder = tbLocation.Text & tbProject.Text & tbBinder.Text
Dim drNewBinderRow As DataRow = m_DataTableBinders.NewRow()
drNewBinderRow("KeyValue") = keyValueBinder
drNewBinderRow("Location") = tbLocation.Text
drNewBinderRow("ProjectName") = tbProject.Text
drNewBinderRow("BinderName") = tbBinder.Text
drNewBinderRow("LastUpdated") = Now
m_DataTableBinders.Rows.Add(drNewBinderRow)
m_DABinders.Update(m_DataTableBinders)
boolCreateBinderOK = True
Catch dbException As System.Data.SqlClient.SqlException
boolCreateBinderOK = False
MessageBox.Show("SQLException: " & dbException.ToString)
MessageBox.Show("Error creating Binder row - probably duplicate values", "Binder - Error Creating Binder Row",
MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch dbException As Exception
boolCreateBinderOK = False
MessageBox.Show("SQLException: " & dbException.ToString)
MessageBox.Show("Error creating Binder row", "Binder - Error Creating Binder Row",
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
BTW - 我得到的错误是:SqlException(0x80131904)违反主键约束'PK.Binders'无法在对象'dbo.Binders'中插入重复键。重复键值是(我的数据)。声明已经终止。
答案 0 :(得分:1)
我认为在更新之前需要commit对DataTable的更改 数据集。
m_DataTableBinders.Rows.Add(drNewBinderRow)
//add this line to commit the changes
m_DataTableBinders.AcceptChanges()
m_DABinders.Update(m_DataTableBinders)
答案 1 :(得分:0)
通常,您不会对DataTable
进行长期引用。
使用ADO.NET进行数据库更新的常见代码模式如下所示:
Using connection As SqlConnection = New SqlConnection("connection string")
connection.Open
Using command As SqlCommand = New SqlCommand("INSERT INTO Binders (KeyValue, Location, ProjectName, BinderName, LastUpdated) VALUES (@KeyValue, @Location, @ProjectName, @BinderName, @LastUpdated)", connection)
command.Parameters.AddWithValue("@KeyValue", keyValueBinder)
' TODO: Add the rest of the command parameters '
command.ExecuteNonQuery
End Using
End Using