如何使用VB.NET将数据添加到MS Access数据库?

时间:2014-07-09 20:47:38

标签: vb.net datagridview

我知道这很简单,但我不知道我的代码有什么问题。我曾多次尝试过。 我有两件事,用户名&我的数据库表上的密码。我想将数据添加到DataGridView并将其保存到我的数据库表。我使用2个按钮ADD&保存。

数据库表

ID   Username    Password
 1    Zain        12345
 2    Admin       root

VB.NET代码(如https://www.youtube.com/watch?v=XRVBpTFa3To中所述)

Public Class edmin

Private Sub edmin_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'TODO: This line of code loads data into the 'UserInfoDataSet1.Users' table. You can move, or remove it, as needed.
    Me.UsersTableAdapter.Fill(Me.UserInfoDataSet1.Users)

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    UsersBindingSource.AddNew()

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Try
        UsersBindingSource.EndEdit()
        UsersTableAdapter.Update(UserInfoDataSet1.Users)
        MessageBox.Show("Saved")
    Catch ex As Exception
        MessageBox.Show("error")

    End Try
End Sub

结束班

1 个答案:

答案 0 :(得分:0)

添加数据文件时,例如MDB或ACCDB,对于您的项目,它将成为源文件。在调试器中运行项目时,您的应用程序无法连接到该数据库。构建时,源数据文件将与EXE一起复制到输出文件夹,并且它是您在运行时连接的副本。如果您在源文件中查找测试期间添加的任何数据,当然您将无法找到它。

当你想到它时,这是完全合理的。在部署应用程序时,您是否真的希望花时间清理数据库以使其处于适合分发的状态?通过对副本进行测试,可以使源数据库保持原始状态。当您构建应用程序的发行版时,干净的源数据库将使用EXE复制到Release输出文件夹中,您的用户将获得该副本。

现在,当您将数据库添加到项目时,默认情况下其Copy to Output Directory属性设置为Copy always。这意味着每次构建项目时都会生成一个新副本。如果运行项目并对数据库进行更改,则停止调试器,更改代码,然后再次运行项目,重建项目并创建数据库的新副本,从而使更改消失。如果您在不对代码进行任何更改的情况下运行项目两次,那么它将无法再次构建,因此不会覆盖工作数据库中的更改。

你应该做什么 - 以及我认为默认情况下微软应该做的 - 是将Copy to Output Directory属性更改为Copy if newer。这样,即使您的项目已构建,也不会创建数据库的新副本,除非您对源数据库进行了更改。这将允许您在工作数据库中保留相同的测试数据,只要您愿意。如果您想重新开始,只需手动从输出文件夹中删除数据文件,或者为单个版本更改Copy to Output Directory

Microsoft警告不要这样做,因为即使您没有对其中包含的数据或架构进行更改,源文件也会发生变化。只需打开文件即可影响它并提示新副本覆盖您的工作目录。如果每次都会创建一个新副本,我会说大呐喊。当我没有意图时,我很少看到数据文件更新。您可以read here获取更多信息。

现在,关于ID,当您添加新行时,DataTable将创建临时ID。只要您在应用程序中使用数据而不将其提交到数据库,该ID就可用于标识行,甚至可以用于标识相关的子行。提交更改时,数据库会生成永久ID。

通常,您当时并不需要该ID,因为您当时和那里都没有使用过该数据。您不会再次使用数据而不会再次检索数据,在这种情况下,您将使用它检索最终ID。但有时候,您确实希望立即检索最终ID。这是必不可少的一种情况是您要保存父记录和一个或多个子记录。保存父记录时,需要从数据库中获取最终ID并将其放回DataTable,以便在保存子行之前更新子行中的外键值(S)。如果保存子行而不这样做,那么您将违反数据库中的外键约束并抛出异常。

某些数据提供商,例如{1}用于SQL Server,每个命令支持多个SQL语句。在这种情况下,您只需在SqlClient语句后添加SELECT语句,新ID就会被检索回INSERT而无需额外代码。不幸的是,Jet和ACE OLE DB提供程序不支持每个命令多个SQL语句。因此,您必须编写一些代码,在插入记录时显式检索新ID。这是一个快速的代码示例,说明如何使用类型化DataSet执行此操作:

DataTable

在这种情况下,''' <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 是我添加到DataSet设计器中的表适配器的查询。它是一个标量查询,只包含以下SQL:

GetLastAutoNumber

您可以找到完整的示例here