您的位置:首页 > 数据库

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

2008-07-09 15:30 309 查看
数据库如何与DataTable同步

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();}
关于使用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下面的可执行文件来查看更新情况
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: