<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下面的可执行文件来查看更新情况