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

数据库如何与DataTable同步

<script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script> 关于使用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下面的可执行文件来查看更新情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值