使用vb.net更新ms访问权限问题主键为-1

时间:2014-08-30 18:29:59

标签: vb.net visual-studio ms-access-2007

我正在创建一个程序,单击数据网格中的单元格,然后将选定的字符串传递给另一个表单中的另一个数据集。之后,带有数据集的表单将其ID(主键)值设置为-1,我认为这是我在更新时遇到错误的原因

我遇到的错误是并发问题,而不是null

请帮忙。我真的需要它

1 个答案:

答案 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