我正在创建一个程序,单击数据网格中的单元格,然后将选定的字符串传递给另一个表单中的另一个数据集。之后,带有数据集的表单将其ID(主键)值设置为-1,我认为这是我在更新时遇到错误的原因
我遇到的错误是并发问题,而不是null
请帮忙。我真的需要它
答案 0 :(得分:0)
如果Access中的表具有类型为AutoNumber
的主键,则.NET DataTable
中的相应列将按您所见的方式运行,即它将生成种子的临时PK值 - 1并递增-1。这样做的原因是确保生成的值不会与数据库中已有的PK值相同。您可以将该PK用作应用程序中的外键来创建子记录。
将父记录保存到数据库时,它会生成最终的PK值,这是保存的内容,而不是临时值。此时,如果您在任何地方使用该临时值,您可以从数据库中获取最终值,然后将其传播到需要的任何地方。通常情况下,它会通过DataRelation
自动传播到同一DataTable
中的一个或多个其他DataSet
个对象。
我会说你的第一个错误就是使用同一DataSet
之外的临时PK。如果您需要在其他地方使用PK,那么您应首先保存数据,获取最终PK并使用它。如果您不能这样做,那么记录应该只在同一个DataSet
内。
您应该检查我的帖子,从Access检索AutoNumber
值并使用DataRelation
传播它们:
http://www.vbforums.com/showthread.php?659052-Retrieve-Access-AutoNumber-Value-After-Insert
以下是带有DataSet
类型的示例代码的关键:
''' <summary>
''' Handles the RowUpdated event of the parent adapter.
''' </summary>
''' <param name="sender">
''' The adapter that saved the row.
''' </param>
''' <param name="e">
''' The data for the event.
''' </param>
''' <remarks>
''' This event handler is used to retrieve an auto-generated ID from the database after a row is inserted and update the corresponding row in the local data set.
''' </remarks>
Private Sub parentAdapter_RowUpdated(sender As Object, e As OleDbRowUpdatedEventArgs)
'We are only interested in new records.
If e.StatementType = StatementType.Insert Then
'Get the last ID auto-generated by the database.
Dim lastAutoNumber = Me.parentAdapter.GetLastAutoNumber().Value
'Update the ID of the local row.
DirectCast(e.Row, ParentChildDataSet.ParentRow).ParentID = lastAutoNumber
End If
End Sub
''' <summary>
''' Handles the RowUpdated event of the child adapter.
''' </summary>
''' <param name="sender">
''' The adapter that saved the row.
''' </param>
''' <param name="e">
''' The data for the event.
''' </param>
''' <remarks>
''' This event handler is used to retrieve an auto-generated ID from the database after a row is inserted and update the corresponding row in the local data set.
''' </remarks>
Private Sub childAdapter_RowUpdated(sender As Object, e As OleDbRowUpdatedEventArgs)
'We are only interested in new records.
If e.StatementType = StatementType.Insert Then
'Get the last ID auto-generated by the database.
Dim lastAutoNumber = Me.childAdapter.GetLastAutoNumber().Value
'Update the ID of the local row.
DirectCast(e.Row, ParentChildDataSet.ChildRow).ChildID = lastAutoNumber
End If
End Sub
GetLastAutoNumber
是添加到设计器中表适配器的自定义标量查询,这是SQL代码:
SELECT @@IDENTITY