【问题标题】:Database not updating via DataGridView数据库未通过 DataGridView 更新
【发布时间】:2016-02-12 22:27:31
【问题描述】:

我正在尝试通过 vb.net 上的 DataGridView 更新访问数据库,而无需使用向导。

但是,我遇到了两个主要问题:

  1. 当我尝试保存添加到网格的内容时,一个消息框会显示来自 try catch 的异常,说 "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

【问题讨论】:

  • 如果是 VB.NET,你可能不需要 access-vba 标签。你添加表两次,就像错误说的那样:在connection.open之后一次,然后再一次
  • 如果您指的是本节 dataTable.Rows.Add(newRow) DataSet.Tables.Add(DataTable) ,那么我已经删除了“添加表”,但问题仍然存在。跨度>
  • DataSet.Tables.Add(DataTable) 2 个地方的完全相同的代码行。如果您摆脱 Try/Catch,它将向您显示导致错误的行 - 可能是该代码的第二个实例。除非您将使用多个 DataTable,否则您实际上并不需要 DataSet
  • (重新编辑)您的数据集是一个表单级对象 - 您不能在每次单击按钮时一遍又一遍地向其添加相同的数据表
  • 关于项目符号 2,保存已消失,第一个原因是数据库上的“复制到输出目录”设置。有关我写的选项,请参阅以下内容,因为许多人没有意识到这一点。 code.msdn.microsoft.com/Working-with-Copy-to-11fbc251

标签: vb.net winforms ms-access datagridview


【解决方案1】:
>  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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多