『转』数据库如何与DataTable同步
2008-07-09 15:30
309 查看
数据库如何与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下面的可执行文件来查看更新情况
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下面的可执行文件来查看更新情况
相关文章推荐
- 数据库如何与DataTable同步
- C#如何重DataSet的DataTable里面删除信息并更新到数据库
- [VB.NET]我在dataset里新建了一个datatable表,不知道如何把表添加到数据库里面,请指点一下!
- 删除DataTable中的一行后,无法同步到数据库中的原因
- Visual Studio 2008中如何比较二个数据库的架构【Schema】和数据【Data】并同步 [转贴]
- 如何保证 数据库/文件 之间的同步
- 如何实现两个数据库同步?
- MySql 如何实现不同数据库同步【2个】
- 如何实现实时监控数据库主从同步的状态
- 如何解决主从数据库同步延迟问题?
- 【数据库-Azure SQL Database】如何创建事务复制将本地数据同步到 SQL Azure
- 问题:如何通过触发器实现数据库的即时同步?
- (2008数据库同步)如何配置发布和分发 (SQL Server Management Studio)
- 快照、刷新-[置顶] Oracle如何实现两个数据库的同步(用实体化视图实现)(oracle快照实例)-by小雨
- 两台oracle10g数据库,如何才能进行数据同步
- django models 增加字段(或新表)后如何同步到数据库
- Visual Studio 2008中如何比较二个数据库的架构【Schema】和数据【Data】并同步
- [转]Visual Studio 2008中如何比较二个数据库的架构【Schema】和数据【Data】并同步
- 如何读取CSV文件到DataTable中,然后存到数据库
- 如何实现两个数据库的同步?