2015-11-11 2 views
2

Я пытаюсь обновить базу данных доступа через DataGridView на vb.net без использования мастера.База данных не обновляется с помощью DataGridView

Однако я столкнулся два основных вопроса:

  1. При попытке сохранить содержимое добавляется к сетке, окно сообщений отображает исключение из попытке поймать говоря "DataTable already belong to this dataSet".

  2. Когда я смог внести изменения без исключения, данные были сохранены в базе данных, однако, когда я позже закрыл повторно открытую базу данных и DataGridView, изменения были отменены. Обратите внимание, что база данных была помещена в папку bin/Debug.

Вот код для события спасительной:

Dim dataAdapter As New OleDbDataAdapter 
Dim DataTable As New DataTable 
Dim DataSet As New DataSet 
Dim Connection As New OleDbConnection 

Private Sub btnsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsave.Click 
    Try 
     Connection.Open() ' the following decleration are used to save content to the table.  
     dataSet.Tables.Add(dataTable) 
     dataAdapter = New OleDbDataAdapter("SELECT * FROM Students", Connection) 
     dataAdapter.Fill(dataTable) 
     Dim newRow As DataRow = dataTable.NewRow 
     With newRow ' the with statement allows you do repeatedly apply a property to a certain object 
      .Item("StudentID") = txtStudentID.Text ' these statements add the content of the text boxes to these respective fields in the database 
      .Item("TeacherID") = txtTeacherID.Text 
      .Item("StudentFirstName") = txtStudentFirstname.Text 
      .Item("StudentSurname") = txtStudentSurname.Text 
      .Item("StudentPassword") = txtStudentPassword.Text 
      .Item("StudentGroup") = cbxStudentGroup.Text 
     End With 
     dataTable.Rows.Add(newRow) 
     DataSet.Tables.Add(DataTable) 
     Dim Command As New OleDbCommandBuilder(dataAdapter) 
     dataAdapter.Update(dataTable) 'updates the table 
     Connection.Close() 
     ShowItems() ' displays the table 

    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
     Connection.Close() 
    End Try 

End Sub 

Если больше деталей требуется просят об этом. редактировать: я обнаружил, что первая проблема также распространена при попытке удалить что-то через DataGrid, вот код:

Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click 
    Try 
     dataSet.Tables.Add(dataTable) 
     Connection.Open() 
     dataAdapter = New OleDbDataAdapter("SELECT * FROM Students", Connection) 
     dataAdapter.Fill(dataTable) 
     dataTable.Rows(0).BeginEdit() 
     dataTable.Rows(0).Delete() 
     dataTable.Rows(0).EndEdit() 
     Dim Commandbuilder As New OleDbCommandBuilder(dataAdapter) 
     dataAdapter.Update(dataTable) 
     dgrStudentDatabaseViewer.DataSource = dataTable.DefaultView 
     Connection.Close() 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
     Connection.Close() 
    End Try 
End Sub 
+0

вам, вероятно, не нужен тег access-vba, если это VB.NET. вы добавляете таблицу дважды так же, как в сообщении об ошибке: один раз сразу после connection.open, а затем позже – Plutonix

+0

, если вы ссылаетесь на этот раздел dataTable.Rows.Add (newRow) DataSet.Tables.Add (DataTable), то я удалил это «добавление таблицы» все же проблема сохраняется. – User59

+0

'DataSet.Tables.Add (DataTable)' такая же точная строка кода в 2-х местах. если вы избавитесь от Try/Catch, он покажет вам строку, вызывающую ошибку - возможно, второй экземпляр этого кода. Если вы не будете работать с несколькими DataTables, вам действительно не нужен DataSet – Plutonix

ответ

0
> Public Sub fillDatatable(_datatable As DataTable, Query As String) 
>  Dim sqlQuery As String = (Query) 
>  Using conn As New SqlConnection("YourConnectionString") 
>   conn.Open() 
>   Using da As New SqlDataAdapter(sqlQuery, conn) 
>    da.Fill(_datatable) 
>   End Using 
>   conn.Close() 
>  End Using End Sub 

Private Sub yourEvent() 
    Using xDT As New Datatable 
     fillDatatable(xDT, "Your Query;") 
     yourDGV.DataSource = sssCompDT 
     yourDGV.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill 
     yourDGV.Refresh() 
    End Using 
End Sub 

это должно открыть отображения результатов SQLQuery к DataGridView, увидеть, если он работает с вашей стороны: D