UpdateSQL 怎样对无关键字的表更新?(45分)

  • 主题发起人 主题发起人 philips
  • 开始时间 开始时间
多谢海大侠关注! 已发给你了。
 
今天刚刚受到程序,这个问题确实很“复杂”呀!

1.首先你要对update_sql的方式理解正确,即update句子
的where 部分要用 dpt_no=:Old_dpt_no and ....,
其中OLD_...是update SQL的保留字,用于表示原来的值。
这一点,沈前卫的例子中已经给出,不过在当前情况下,
这一点是次要问题了。

2."update failed"是BDE"智能"判断的错误,即他发现
你只修改了一条记录,而数据库中更新的记录是多条,因而报错。
根本原因是你的数据库中存在着彻底重复的记录,即使把所有
字段都用于更新条件的判断也无法避免重复。如果你能避免存在完全重复的记录
这一问题,则可以把update sql 中的条件"加多",可以防止"update failed"。

3.你的DBF确实奇怪,简单order by之后就不能更新了。
恐怕是结构问题,不知道使用什么创建的,建议你改用paradox数据库,
或者用Database Desktop创建DBF,绝对可以更新,例如:
select * from animals where weight >8 order by name
一般而言,简单的行列子集试图都是可更新的,BDE支持的虽然不好,
但象你的程序这样简单的查询,肯定是可更新的!
 
注:上述3.中我所说的可以更新是指:requestlive+edit/insert/delete/post
 
To :温柔一刀

多谢大侠相助!

我的表是用 foxpro 3.0 创建的。

我曾试过,用 Desktop创建的 DBF Foxpro 又无法识别,故此 用 foxpro 3.0 创建。

但反过来却可以,可又出现了Order By 后不能修改的问题,看来应再按你说的

将表改用 DeskTop 建表。让我试试...

 
刚刚试过,对paradox表,以下语句的 query 可以更新(requestlive+edit/insert/delete/post)

Query_Dpt.Sql.Text:='select * from dpt order by Dpt_no';
Query_Dpt.Open;

而以下语句的 query 不可以更新

no := Query_Dpt.FieldByName('dpt_no').AsInteger;

Query_p.Sql.Text :='select * from pp where dpt_NO =:DptNo order by p_NO';

Query_p.ParamByName('DptNo').asInteger := no;
Query_p.Active := True;

可我实际需要对后者修改,不知如何是好,欲借助 UPDATESQL ,可总是 Update failed....
 
非常抱歉,由于时间短,没有充分测试,答案有误。

真正“答案”就在我前面说的2.里面,没办法,
这是无法解决的问题,你的表里有完全重复的记录,
因此updateSQL就会出现failed,requestlive也没用。
真不明白一个表里存在完全重复的记录干什么?(百思不得其解状...)

我想你可能是由于试验太多,数据已经乱了,
在实际应用中,只要没有完全重复记录,
把所有的字段都通过 dpt_no=:Old_dpt_no and ....的形式
放在update 的where 字句中,更新就不会出错了.

如果你实在要存在完全重复记录(实在受不了啦!),
用table+lookupfield+index吧!
 

我也不希望有完全重复的记录,那有什么用啊?(除了浪费磁盘空间)
请把你做的好用的例子(用updatesql的 和 requestlive=true的)寄给我一份好吗?
我将不胜感激!

email: philips01@wx88.net
 
我不想就这个问题多发言了,前面已经说的很清楚了,总结一下:

在存在完全重复的记录的表中,用tquery则:
1. requestlive不可能!
2. updatesql会出现update failed,无可避免!

如果某些记录不存在完全重复,则下面方法可以通过:
updatasql:
update p.dbf set dpt_no=:dpt_no, name=:name
where dpt_no=:Old_dpt_no and name=:Old_name and p_no=:Old_p_no
//你的所有字段都写进where条件中,可以最大限度地避免update fail.

你的数据已经乱了,很多重复记录,你可以用DBD把数据内容改一下,肯定成功。

(菩提老祖:138次,这个人一定欠了你很多钱...)
 
45分太少了,可当时我只有这些,都给温大侠吧!
尽管问题我还没有搞定...
(我新建了一个表,只有少数的几条记录,不可能有完全重复的记录,问题依然存在?
可我又不想用table,真是没办法!),
 
例子受到了,
温大侠就是大侠,果然厉害,困扰我多日的问题最终还是温大侠搞定,等我攒够
100¥,请温大侠喝酒。。。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
432
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
676
import
I
后退
顶部