Rows.delete和Rows.remove的问题

leier01 2005-11-24 02:41:16
测试第一步:
自定了一个表对象 Dim mydt AS DataTable
用mydt.Rows.add方法,向其中加了10条记录,这时候,mydt.Rows.Count的结果是10.
然后,用mydt.Rows().Delete方法,删除了2条记录,这时候,mydt.Rows.Count的结果是8!!!

测试第二步:
  Dim Sqlconn As New SqlConnection(connStr)
  Dim sqlDS As New DataSet
  Dim sqlDA As New SqlDataAdapter(sSQLString, Me.Sqlconn)
  Sqlconn.Open
  sqlDA.Fill(sqlDS,"测试表")
这时候sqlDS.Tables("测试表").Rows.Count为10.
然后,用sqlDS.Tables("测试表").Rows().Delete方法,也删除了2条记录,这时候,Rows.Count的结果却是10,而不是8.
而如果用sqlDS.Tables("测试表").Rows.Remove方法,删除2条记录,Rows.Count才是8.


请问,为什么同样是用Rows.Delete方法,Rows.Count的结果会不一样呢,这是为什么??
...全文
676 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
leier01 2005-11-24
  • 打赏
  • 举报
回复
学到了
xzhy80 2005-11-24
  • 打赏
  • 举报
回复
dui le
记得以前研究过
明白过
现在看了楼上的
才有想起来
前几天的代码写的真是///
都忘了:(
ljasmine 2005-11-24
  • 打赏
  • 举报
回复
刚才测了一下是这样的
用mydt.Rows.add添加10条记录后,如果没有用mydt.AcceptChanges方法,那么这10条记录的状态为Added,这时如果用dt.Rows.Delete方法删除状态为Added的纪录,则被删除的记录就直接被从rows集合中去掉了,所以mydt.Rows.Count变为8;但是如果用mydt.Rows.add添加10条记录后,接着使用mydt.AcceptChanges方法,则它们的状态就变为Unchanged,如果再用dt.Rows.Delete删除记录,这时它们只是被标记为Deleted,而没有从rows集合中真正删除掉,所以mydt.Rows.Count不变。
hamadou 2005-11-24
  • 打赏
  • 举报
回复
不难发现:
因为楼主在对创建的datatable添加记录后,根本没有执行acceptchanges,那么他的记录状态都是added,也就是根本没有被认为是已经“接受的记录”,那么你在delete的时候自然就不会被先把状态设置为“deleteed”,而是直接删除了。
但对于填充出来的数据,最开始的状态都是unchanged,那么你再delete操作就会被做标志处理,但remove方法,我已经说过它是直接对数据集的操作,不会去设置行的状态。
hamadou 2005-11-24
  • 打赏
  • 举报
回复
道理很简单:大家来执行如下的代码:
Dim tbl As New DataTable
tbl.Columns.Add("id", GetType(Integer))
tbl.Columns.Add("name", GetType(String))
Dim i As Integer
For i = 0 To 5
Dim r As DataRow = tbl.NewRow
r(0) = i
r(1) = "name_" & i.ToString
tbl.Rows.Add(r)
Next
Dim hr As DataRow
For Each hr In tbl.Rows
MessageBox.Show(hr.RowState.ToString)
Next
MessageBox.Show(tbl.Rows.Count, "添加后")
tbl.Rows(2).Delete()
MessageBox.Show(tbl.Rows.Count, "未acceptechanges")
tbl.AcceptChanges()
tbl.Rows(2).Delete()
MessageBox.Show(tbl.Rows.Count, "acceptchanges后")
leier01 2005-11-24
  • 打赏
  • 举报
回复
有意思,我试一下
搬运工木木 2005-11-24
  • 打赏
  • 举报
回复
嘿嘿,这个倒是蛮有趣的,估计是系统在提交前做的优化吧,我猜想就是ADD的值,如果没更新之前就delete,那么系统就是把这个ADD去掉
你有兴趣可以这样试一下,先去数据库里取5条记录,再用ADD加5条,再用delete删除数据库里取出来的5条中的2条,看值是10还是8,我猜想是10
leier01 2005-11-24
  • 打赏
  • 举报
回复
xinggg,
如果你是说delete方法不会改变count值的话,那怎么解释第一步中的delete后,count会随之减少,由10变成8呢?
搬运工木木 2005-11-24
  • 打赏
  • 举报
回复
你自己都说了,一个是标记,一个是真正的删除,结果当然不一样了,例如,杀人,画上一个勾,不等于你就把这个人杀了,一定要刀砍下去,人头落地了才算杀了,delete就是画勾,remove就是拿刀砍(以上比喻都是针对datatable啊,和数据库没关系啊)
leier01 2005-11-24
  • 打赏
  • 举报
回复
测试的结果的确是这样,
自定义的一个表,用delete方法删除了行,count的值会减少.

而fill出来的表,用delete方法删除了行,count值没变化的.

奇怪.
leier01 2005-11-24
  • 打赏
  • 举报
回复
我看到的资料上,Rows的delete方法是标记要删除的DataRow.
Rows的remove方法是将Datarow从行集合中删除.

可是问题是,我测试的结果,两种情况下,都使用Rows.delete方法,结果却不一样,为什么?
hamadou 2005-11-24
  • 打赏
  • 举报
回复
因为你的datatable中的值如果是fill出来的,那么每一行记录就都有一个状态,delete方法,把行状态设置为deleteed,但却没有真正地删除,只要执行了update以后,并acceptchange后才会真正地删除。但remove方法却是直接从数据集中删除记录,但并不影响到数据库。
hainang1234 2005-11-24
  • 打赏
  • 举报
回复
用Delete方法的话,应该不会改变Count。因为只是加个标记嘛。
而Remove方法会删除内存中的项,所以Count肯定改变。

至于前面的Delete方法改变Count值,我还没测过!
搬运工木木 2005-11-24
  • 打赏
  • 举报
回复
估计delete是做了一个删除标记吧,(如果提交的话,会把数据库里的相应记录删除掉)而remove则是仅仅从datatable中移除,基本上和原来数据库没什么关系(离线的)
JzeroBiao 2005-11-24
  • 打赏
  • 举报
回复
平时也是用Remove,在SDK里没有Delete方法.

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧