『转』数据库如何与DataTable同步

本文详细解析了使用DataAdapter实现DataTable与数据库之间的同步过程。通过示例代码解释了不同状态位(如Added、Modified、Deleted)如何影响数据更新,并强调了关键步骤及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库如何与DataTable同步

关于使用adapter.update更新数据库的问题作一个系统性的总结 首先参照MSDN上的代码,结合access数据库,生成代码如下   Private Sub modityRow()        Dim connectionString As String = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = mag.mdb"     Dim queryString As String = "select * from payinfo"     Dim DS As DataSet = New DataSet          Using connection As New OleDbConnection(connectionString)     connection.Open()     Dim adapter As New OleDbDataAdapter()     adapter.SelectCommand = New OleDbCommand(queryString, connection)     Dim dbcb As OleDbCommandBuilder = New OleDbCommandBuilder(adapter)          adapter.Fill(DS, "access")          '     '******************************     '     '这里填入修改dataSet的代码     '     '******************************     '          adapter.Update(DS, "access")     DS.AcceptChanges()          End Using        End Sub 代码本身没有什么难度,大家都看的懂。那么到底adapter.Update是如何更新数据库的呢 比如刚才我们的上面的代码运行到adapter.Fill(DS, "access")是成功的,那么通过语句 dim DT as DataTable = DS.Tables("access")就可以获得一个DataTable对象, DataTable对象的每一行都有一个状态位,可以通过DT.Rows(i).RowState来获得第i行的状态位,我们简单的假设如下 DT id    name    pay    状态位 1     张三    100    Unchanged 2     李四    100    Unchanged 因为所有行的状态位都没有改变,DS.hasChanged()返回false,所以即使调用了adapter.Update方法,数据库也不会有任何的更新.现在我们向该dataTable里面添加一条新记录,代码如下   dim newRow as DataRow = DT.NewRow()   newRow.Item(0) = 3   newRow.Item(1) = "王五"   newRow.Item(2) = 100   '当然,我们新添加的这行也有状态位,但是他的状态位不是Unchanged,因为他还不是任何DataTable的成员, 所以他的状态位为Detached(游离状态),我们必须把他附加给一个DataTable.   DT.Rows.Add(newRow) 这时候我们在来看看DT id    name    pay    状态位 1     张三    100    Unchanged 2     李四    100    Unchanged 3     王五    100    Added 由于"王五"是新添加的,所以状态位不是Unchanged,而是Added,DS.hasChanged()返回true 同理可得,修改一条记录的情况。如下(修改第2行,第2列)   DT.Rows(1).Item(1) = "李六" 这时候我们在来看看DT id    name    pay    状态位 1     张三    100    Unchanged 2     李六    100    Modified 3     王五    100    Added 最后是删除的情况,删除的情况分为DT.Rows(i).Remove()和DT.Rows(i).Delete()两种,(i=0)使用后的效果如下 DT.Rows(i).Remove() id    name    pay    状态位 2     李六    100    Modified 3     王五    100    Added DT.Rows(i).Delete() id    name    pay    状态位 1     张三    100    Deleted 2     李六    100    Modified 3     王五    100    Added DT.Rows(0).Remove()方法直接T除了第一行,因此,就算第一行的状态位之前被修改过,也不可能与数据库同步了,第一行已经不存在了。 当需要修改的操作都已经完成了,调用adapter.update(DT)方法,adapter根据每行的状态位,更新数据库内容。 最后调用DS.AcceptChanges()方法,此时再来看看DT id    name    pay    状态位 2     李六    100    Unchanged 3     王五    100    Unchanged 到这里,DataSet与数据库同步结束了。 注意: 1、必须激活OleDbCommandBuilder对象,该对象是OleDb产生adapter.insertCommand,adapter.updateCommand,adapter.deleteCommand的关键 2、DS.AcceptChanges()方法必须写在adapter.update(DT)的后面,否则状态位都接受了改变,就不能更新数据库了。 3、调试状态下,每调试一次,Resources下面的access数据库都会覆盖bin/Debug/Resources下面的数据库,所以上次的更新会被还原。可直接运行bin/Debug下面的可执行文件来查看更新情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值