2014-02-09 3 views
0

У меня есть форма с 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 

ответ

1

Таким образом, что идентификаторы автоматически генерируемым размножают обратно в DataTable при использовании SqlClient является включением ЗЕЬЕСТА в CommandText вашего InsertCommand. Поставщики Jet и ACE OLE DB не поддерживают несколько операторов для каждой команды, поэтому это не вариант. Я написал некоторый пример кода для Access специально на другом сайте, но сейчас он не работает, поэтому я не могу дать вам ссылку. Вот еще один пример:

http://support.microsoft.com/kb/816112/en-gb

Этот код является C#, но принцип точно такой же: обрабатывать событие RowUpdated вашего адаптера данных, получить идентификатор из базы данных и обновления DataRow.

+0

Я использовал этот пример. См. Дополнительный код, который я вставил выше. Это как-то вроде разъединения между моим DataAdapter и моим объектом BindingSource. Обновление никогда не доводит до DataGridView. – HK1

+0

Это другой сайт сейчас в сети, вот ссылка, которую я хотел бы предоставить в первую очередь: http://www.vbforums.com/showthread.php?659052-Retrieve-Access-AutoNumber-Value-After-Insert&highlight= – jmcilhinney

+0

Хорошо, я не думаю, что мне нужно .NET для вставки уникальных идентификаторов, как в этом примере. Что я сделал, я добавил DataGridView.Refresh() сразу после моего кода, который возвращает последний идентификатор. – HK1