以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [20191208已修复]20191206的web数据源一个致命灾难性的bug!DataTable("xx").DataRows.Clear 居然等于 DataTable("xx").SQLDeleteFor(""),删表跑路了  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=143822)

--  作者:chen37280600
--  发布时间:2019/12/5 11:07:00
--  [20191208已修复]20191206的web数据源一个致命灾难性的bug!DataTable("xx").DataRows.Clear 居然等于 DataTable("xx").SQLDeleteFor(""),删表跑路了
在web数据源下,DataTable("xx").DataRows.Clear 居然是清空数据库里该表的所有数据,而不是加载到本地的!

也就是
DataTable("xx").DataRows.Clear  = DataTable("xx").SQLDeleteFor("")

实在是太可怕了!彻底清空数据,不可挽回的灾难。这个清空用户数据的bug,简直比内存泄露和报错退出还要严重!


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:2.png
图片点击可在新窗口打开查看


备注:在直连数据源的情况下,是没有这个问题的

图片点击可在新窗口打开查看此主题相关图片如下:3.png
图片点击可在新窗口打开查看

我的数据库是SQL2008,服务器是win2016,web数据源是http,https也试过,一样出问题



[此贴子已经被作者于2019/12/7 14:32:20编辑过]

--  作者:有点蓝
--  发布时间:2019/12/5 11:22:00
--  
一直都这样的好不!http://www.foxtable.com/webhelp/topics/0419.htm

例如:

With DataTables("订单")
    
.DataRows.AddNew() \'增加一行
    .DataRows.AddNew(3) \'增加 三行
    
.DataRows.Delete(0\'删除第一行
    
.DataRows.Clear() \'清除所有行
End With

Clear方法会直接从后台清除所有行,并即刻生效,且不能撤销,所以一定要慎重使用。


--  作者:chen37280600
--  发布时间:2019/12/5 11:24:00
--  
不是这样的,你看2个数据源的对比,完全一样的代码


DataRow都是存在本地内存里的行,没加载到本地的,就不在Clear范畴里

图片点击可在新窗口打开查看此主题相关图片如下:4.png
图片点击可在新窗口打开查看

Clear只是等于 删除本地的行+保存功能,并不应该能删掉数据库里的数据

而且按照你的说法,就缺了一个 清空已经加载到本地的行的方法了

[此贴子已经被作者于2019/12/5 11:30:47编辑过]

--  作者:chen37280600
--  发布时间:2019/12/5 11:34:00
--  
在官方的一贯的思路了,对外部数据库进行直接操作的,一定会有特别的符号申明,例如SQLxxx,或者是FromSever =True

DataTable都是指已经加载到本地内存的数据,Table是指要展示的部分或全部内存数据。

外部数据源→DataTable内存→Table显示器
3层数据结构很清晰,不应该存在有内存偷偷操作外部数据源的混淆理念
[此贴子已经被作者于2019/12/5 11:34:55编辑过]

--  作者:有点蓝
--  发布时间:2019/12/5 11:40:00
--  
我测试没有问题哦

清空已经加载到本地的行的方法就是:DataTable("xx").DeleteFor("")


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看


--  作者:chen37280600
--  发布时间:2019/12/5 11:45:00
--  
你删除前,本地有12行数据,你外部数据库自然也有12行数据。

你删除本地12行,保存后自动触发删除外部数据源12行,当然没问题

正确方法:
1保证使用web数据源
2确保外部数据源里有数据
3把本地DataTable的loadfilter="1=2",也就是清空加载,让本地DataTable一条数据都没有
4执行DataTable.Clear

5最后,你看下你的外部数据源里,是不是所有数据都没了

简单说:本地没有任何数据下,执行Clear,也会把外部数据源里的数据全部删掉
[此贴子已经被作者于2019/12/5 11:48:34编辑过]

--  作者:有点蓝
--  发布时间:2019/12/5 12:02:00
--  
测试还是没有问题,access和SqlServer的web数据源都测试过了


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看


--  作者:chen37280600
--  发布时间:2019/12/5 12:18:00
--  
好。你就用这段代码,对直连的数据源试试,保证第三阶段最后结果不是0

在直连数据库下,clear不会清除外部数据源的!
[此贴子已经被作者于2019/12/5 12:19:15编辑过]

--  作者:有点蓝
--  发布时间:2019/12/5 13:37:00
--  
确实是这样,问题已反馈!
--  作者:chen37280600
--  发布时间:2019/12/5 14:42:00
--  
1206还是有这个问题,就是Clear方法,官方是想要删除还是不删除外部数据源的东西?

估计现在没多少人在用web数据库,都是直连,过去的项目里,clear一贯思路都是不删外部数据源
突然把它修正为会清空外部数据源,很多人不知道的话,直接到生产环境,发现问题的时候,已经是数据全空,绝对是个会炸的事情
[此贴子已经被作者于2019/12/5 14:52:30编辑过]