请教富翁们:Delta中如何区别被修改为空的字段和本就是空的字段? ( 积分: 100 )

  • 主题发起人 主题发起人 yaxich
  • 开始时间 开始时间
Y

yaxich

Unregistered / Unconfirmed
GUEST, unregistred user!
搜了一下,也没有找到答案,问题和http://www.delphibbs.com/delphibbs/dispq.asp?lid=2456685一样的,在此直接将该帖子移过来了:
比如Delta如下
id Name SL DJ BS
1 火箭炮 1 200 打不响
NULL NULL 2 NULL NULL
究竟那个NULL代表不修改,那个代表是用户修改成NULL呢?
比如我在操作中,ID、Name和DJ字段都没有做修改,所以对应的usModified的记录中该字段对应为NULL,SL由1改为2,反映正常,但把“打不响”删成了'',Delta中对应的字段也是NULL,那么该如何区分BS字段这个NULL和其它如ID字段的NULL呢?
请高手指点!
另外,如果ljhuacn已经解决此问题,也请解答一下。
 
搜了一下,也没有找到答案,问题和http://www.delphibbs.com/delphibbs/dispq.asp?lid=2456685一样的,在此直接将该帖子移过来了:
比如Delta如下
id Name SL DJ BS
1 火箭炮 1 200 打不响
NULL NULL 2 NULL NULL
究竟那个NULL代表不修改,那个代表是用户修改成NULL呢?
比如我在操作中,ID、Name和DJ字段都没有做修改,所以对应的usModified的记录中该字段对应为NULL,SL由1改为2,反映正常,但把“打不响”删成了'',Delta中对应的字段也是NULL,那么该如何区分BS字段这个NULL和其它如ID字段的NULL呢?
请高手指点!
另外,如果ljhuacn已经解决此问题,也请解答一下。
 
看了你的问题觉得最好是换个角度看问题,或许有别的办法达到你的目的。至于“两个”NULL有何区别,我想没人能分出来(我是不认为它们有什么不同),难道有两个不同的NULL吗?我觉得解决问题的办法有两个:一是修改字段的缺省值,二是设置标志字段。如果要彻底解决问题你最好把需求贴出来,大家一起想办法总会有满意的结果的。
 
使用newValue和oldValue就可以判断改变前后的值的情况
 
谢谢newsmile的提议,下面详细说说我的问题。
我正在用Delphi7做三层的系统,在Rdm上的一个DataSetProvider与一个DataSet关联,DataSet执行SQL语句后,在DataSetProvider中会有封装执行结果的Data,将该OleVariant对象作为参数通过函数传递到客户端,客户端用ClientDataSet接受。
客户端的ClientDataSet进行数据更新后,其更新结果存放在了其Delta属性中,用户提交时,程序通过调用Rdm函数将该Delta属性作为参数传递回Rdm,在Rdm中用一ClientDataSet接受此Delta数据封包,我写了一个统一的方法对该ClientDataSet内的数据进行了分析,并完成UpdateSQL语句的构造,以完成数据更新。
Rdm上ClientDataSet接受传来的Delta后,对于被修改的记录,是表现为两条记录的,一条是原记录,一条记录修改情况,其中原记录和修改前一致,第二条记录中仅仅在修改的字段上保存新字段值,其它未修改的为NULL,如ID,Name等字段,如主贴中的例子,现在的问题是客户端修改数据时,将某个字段值清空,如将DJ字段值由“打不响”置为“”,在Delta中该DJ字段也表现为NULL,这样与其它如ID、Name等字段表现相同,无法判断出它被修改了,哪位富翁研究过这些东东,给与指点!分不够再加!
谢谢!
 
各位老大,辛苦辛苦,帮小D解决一下这个问题吧!
谢谢啦!
 
NULL几自动产生的不用管,表示该字段没有修改过!
OK,给分,我要分.冲呀
 
to 5207:
请看上文,我知道没有修改的字段设置为NULL,但对于字段值被清空的情况也被设置为NULL,问题的关键就在于如何区分这两种情况!
分,绝对给,只要能解决问题,这些分不够可以再加。
 
NULL就是空,空就是NULL,除非多设置一个值,表示修改的时间
 
对于字符型字段,你可以截获TField的OnChange事件,将NULL可以修改成空字串''来表示NULL. 如果一定要将数据库里的值修改成NULL,你可以截获TDataSetProvider的BeforeUpdateRecord事件,将NewValue=''的字段手工更新至数据库.
这样也许太麻烦了,不知有没有更好的方法.
 
to z_cd:
可能是我表达的不够清楚,使你理解错误了。
实际上,我在客户端的确是将某个字段值置为''了,但Delta中作为修改结果的那条记录中相应的字段值却被Delphi如同未做修改的字段一样设置成了NULL,这导致我无法从此处区分出哪些字段值被修改成'',而哪些又未做修改。应该如何区分?这就是我问题的关键。
我的思路是Delphi肯定会有标志的,因为Delphi的Midas技术在将客户端数据提交到中间层时也是提交的这个Delta,然后用TDataSetProvider来进行分析并生成更新语句的,问题是对于Delta的结构,Delphi一直没有公开,我找了很多资料也没有找到这个标志,所以想在此听听有经验的富翁的指点,毕竟,这儿卧虎藏龙,肯定有富翁对这些更有研究的。
谢谢所有关注的富翁,更期待着能这个问题能早日得到解答。
这个问题的解答将标志着我们又有一种比较灵活而可靠的数据更新手段了,希望对Delphi三层技术有兴趣、而象我一样还没有掌握这个技术点的同道多家关注!
 
很早就试过, 如果客户端将字段设成了空字符串'', Delta中就不会是NULL的, 保证是'',
但是客户端将字段设成Null, Delta就傻了, 不会更新了, 这种情况以前我们
在客户端将需要设为Null的字段组合成一句新的SQL语句传给服务端再执行一次,方法巨傻
 
OK,问题解决了,谢谢大家。
 

Similar threads

后退
顶部