У меня есть форма с DataGridView, привязанная к объекту BindingSource, который подключен к базе данных Access, которая использует Autonumber в качестве поля ID.DataGridView с DataTable/BindingSource, не показывающий новый идентификатор Autonumber
Когда записи редактируются, удаляются или создаются, я запускаю метод обновления DataAdapter, который отлично работает. Но новые записи не показывают свой идентификатор и пытаются удалить результаты новой записи в исключении DBConCurrencyException.
Есть ли способ сообщить мне BindingSource, Databable или Dataset для обновления/перезагрузки записи? Каков наилучший способ показать идентификатор Autonumber для новой записи?
(Внимание, я знаю, что это не хорошо написано, хорошо отведенной код.)
Private conString As String = "Provider=Microsoft.ACE.OLEDB.12.0; " +
"Data Source=C:\data.accdb"
Private conn As OleDbConnection
Private WithEvents da As OleDbDataAdapter
Private ds As DataSet
Private builder As OleDbCommandBuilder
Private WithEvents bs As BindingSource
Private Sub AccessDataGridView_Load(sender As Object, e As EventArgs) Handles Me.Load
dgv1.AutoGenerateColumns = True
Call GetData("SELECT * FROM lots")
dgv1.DataSource = bs
dgv1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
End Sub
Private Function GetData(sSQL As String)
If conn Is Nothing Then
conn = New OleDbConnection
conn.ConnectionString = conString
conn.Open()
End If
da = New OleDbDataAdapter(sSQL, conn)
builder = New OleDbCommandBuilder(da)
ds = New DataSet
da.Fill(ds)
bs = New BindingSource
bs.DataSource = ds.Tables(0)
End Function
Private Sub bs_CurrentItemChanged(sender As Object, e As EventArgs) Handles bs.CurrentItemChanged
If ds.HasChanges() = True Then
da.Update(CType(bs.DataSource, DataTable))
End If
End Sub
Private Sub bs_ListChanged(sender As Object, e As System.ComponentModel.ListChangedEventArgs) Handles bs.ListChanged
If ds.HasChanges() = True Then
da.Update(CType(bs.DataSource, DataTable))
End If
End Sub
Private Sub da_RowUpdated(sender As Object, e As OleDbRowUpdatedEventArgs) Handles da.RowUpdated
If e.Status = UpdateStatus.Continue _
AndAlso e.StatementType = StatementType.Insert Then
Dim cmdGetIdentity As OleDbCommand
cmdGetIdentity = New OleDbCommand()
cmdGetIdentity.CommandText = "SELECT @@IDENTITY"
cmdGetIdentity.Connection = conn
e.Row("lotid") = Int32.Parse(cmdGetIdentity.ExecuteScalar().ToString())
e.Row.AcceptChanges()
'This appears to work with no problem, but the DataGridView
'still doesn't show the new ID
'EDIT
dgv1.Refresh() 'This fixed the problem mentioned directly above
End If
End Sub
Я использовал этот пример. См. Дополнительный код, который я вставил выше. Это как-то вроде разъединения между моим DataAdapter и моим объектом BindingSource. Обновление никогда не доводит до DataGridView. – HK1
Это другой сайт сейчас в сети, вот ссылка, которую я хотел бы предоставить в первую очередь: http://www.vbforums.com/showthread.php?659052-Retrieve-Access-AutoNumber-Value-After-Insert&highlight= – jmcilhinney
Хорошо, я не думаю, что мне нужно .NET для вставки уникальных идентификаторов, как в этом примере. Что я сделал, я добавил DataGridView.Refresh() сразу после моего кода, который возвращает последний идентификатор. – HK1