是否FoxPro表无法用TQuery/TUpdateSQL实现CachedUpdates(100分)

  • 主题发起人 主题发起人 天梦
  • 开始时间 开始时间

天梦

Unregistered / Unconfirmed
GUEST, unregistred user!
我一切都照着示例来的,除了数据表不是SQL表是FoxPro表外。
执行Database.ApplyUpdates()后,数据似乎是存了,但重新
打开后发现还是原样。
 
》》》》》
 
你一定没有设TQUERY的UPDATEOBJECT。
在表单上放一TUPDATESQL,将TQUERY的
UPDATEOBJECT设为TUPDATESQL。
然后,在TUPDATESQL中产生INSERT,
DELETE各UPDATE的SQL语句。就OK。
 
我也遇到这样的问题:
我的表中无关键字(关键字不唯一),我欲数据在显示时可进行修改,且按某字段有序,

没有索引,因此使用query控件,表 p.dbf(dpt_no,person_no)
SQL :
select * from p.dbf
where dpt_no = :some_dpt_no
order by person_no

按教材所说 Query 的 RequestLive 为True是不能修改的(因有order by),故要用UpdateSQL

我希望将用户的全部修改都保存到p.dbf表中(Query 的 CacheUpdate 已为True ),

但总是:
Update Failed!

why?
 
我的问题和你的问题一样,不知是问错了,还是分数少,回答的不多,只好再把问题

提前,不然没人关注。
 
请大家帮忙!
 
我比东家还着急,可又没有分,只好在这盯着...
 
你为什么不跟踪sql语句,看一下发到后台的到底是什么?还是根本没发
 
To mech
我有设置TUpdateSQL

To ouke
如何跟踪SQL?

To philips
同病相怜!你的Update Failed是什么情况?
我开始调用Database.ApplyUpdates()时,出现了一个异常,
大意是对于本地数据库,Database.TransIsolation必须是tiDirtyRead
即允许脏读,我在程序里设置后,没有异常了,可是结果不对。

如果搞不定,我就要换用Table了
 
我用query 做数据源,dbgrid编辑数据,在调用 Query.ApplyUpdates后

我的是数据明明修改了(并没有按我期望的那样修改),并显示错误信息 'update failed'.
 
TO :天梦

如果用 table 将失去许多SQL的优点,这样一个常见普通的问题大富翁真的搞不定吗?
 
To :mech

能否发给一个这样的例子?不胜感激!
 
新的一天又开始了,我满怀希望地期盼着...
 
To philips
你改用Query.Database.ApplyUpdates([Query])试试看行不行
 
To philips:
早晨 5:31:35 来寻找回答,精神可嘉!!!BaKuBaKu 这厢有礼了。
首先允许我讲一下 CacheUpdate 的工作原理。
CacheUpdate 的原理是这样的:对于每一条记录都有一个标志位,如果它是新增
的,则有一个类似 "I"的标志,如果被修改,则生成一条新记录,原来记录的标志为
"Old",新记录的标志为 "U",如果被删除,则标志为 "D"。(上述标志为象征意
义,并非真实如此)
在你的另一篇文章里,沈前卫和fstao都作了回答,fstao 的回答不符合你的要
求,因为他是基于主关键字的,而前卫兄的答案似乎也欠妥当,因为仅凭Old_dpt_no
无法精确定位一条记录,从而导致错误的改动。
你的问题总结起来实际上就是,SQL 语句的 Where 条件需要在没有主关键字的
情况下精确定位记录。
问题找出来就好解决了,前卫兄的做法其实是对的,但是 Where 条件不够多,
应该包含足够的,能唯一确定一条记录的字段。实际上就是,用多个字段一起作一个
主关键字。
Philips 最好使用一个主关键字,因为关系型数据库是把记录当成无序的数据集
的,集合里的元素当然不能相同,离散数学讲得很清楚。上面我们可以看到,实际上
仍然要用多个字段一起作一个主关键字来定位记录。
See it?

From: BaKuBaKu
 
把Query1.CachedUpdate=True, Query1.RequestLive=True,
UpdataObject=UpdateSQL1

SaveBtnClick:保存代码
begin
Database1.StartTransaction;
try
Query1.ApplyUpdates;
Database1.Commit;
except
Query1.CancelUpdates;
Database1.Rollback;
raise;
end;
Query1.CommitUpdates;
end;

Query1.Database.TransIsolation := tiDirtyRead;
Query1.Database.ApplyUpdates([Query1]);

这两种都不行

如果Query1.CachedUpdate=True, Query1.RequestLive=True,
不用UpdateSQL,以上两种语句都能正确保存,SQL中有order by
也可以

是否UpdateSQL不适用于Local Database?
 
TO: BaKuBaKu, 天梦

首先向您两位表示感谢!

我的表实际有外部关键字,我想这应该是符合关系型数据库构建原则的,这样,

我把一个示意的小程序发给两位,看看问题出在那里,烦劳两位啦!
 
To :天梦

我试过你说的方法,但一次只能修改一条记录,对吗?如果把记录置于DBgrid内,
同时修改两条以上记录,就会出错。
 
下午我把数据转移到InterBase数据库中,
原来的设置、代码就能起作用了

是否UpdateSQL就是不支持Local Base?
 
夜已深了,问题还是没有答案....
 
后退
顶部