数据库高手快来指点!!!(100分)

  • 主题发起人 主题发起人 netsong
  • 开始时间 开始时间
N

netsong

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个没有关键字的表,用TQuery取出一系列record,在我每读出一条纪录取出某
些字段之后,就改变flag字段的值。
我的程序这样写:
while not rec.Eof do
begin
memo1.Lines.Add(rec.fieldbyname('uid').asstring+' '+rec.fieldbyname('flag').asstring);
rec.CanModify:=true;
rec.UpdateRecordTypes := [rtModified];
rec.Edit;
rec.fieldvalues['Flag']:='2';
rec.Post;
rec.Next;
end;

提示:query 数据是read-only的,我怎么能让他是动态的呢?
或者其他的解决方法也可以!
急呀!
 
你是用Open打开数据库的吗?在用Tquery时,open和execsql是有区别的,
open返回的结果集为只读的,如果要修改记录的值,必须用execsql语句。
 
query.requestlive:=true;
 
snake正确!
 
呵呵,不错,snake是正确的:)
 
正确吗?我看不见得,数据库操作你的TQuery我看不行,你会有提示,
有多条记录需要修改,你只修改了一条.你的没有主关键字的表得
改一改,大忌.也许update可以混过去
 
干吗不用先查寻,后修改。
 
RequestLive := True; 只能尝试允许修改 Query ,但是由于数据库引擎和 SQL 语句的类型的限制,
RequestLive := True; 并不保证 Query 能够被修改,最终还要判断 Query.CanModify 属性。
 
agree with BaKuBaKu
 
如果你使用TQuery.open方法,通常是不能对Query中的数据进行修改的,一般使用Query
会和UpdateSQL现在一起,这样的edit后,使用Database1.ApplyUpdates([query1])应该可
以搞定。
 
RequestLive := True, 只能尝试允许修改 Query
还要判断canmodify属性

 
只有你没有使用 order by, 没有使用多个表连接,没有使用distinct,
没有使用sum、max、count等集合类函数,才能用 RequestLive:=True 来使
该query能直接修改数据。(dbf、paradox可以用order by,但是排序列必须有索引)

否则就要使用 UpDateSQL 来使数据能被修改。

(另外,没有主键的表已经过时,还会带来很多问题,除非你的数据库
是oracle、interbase之类,数据库提供 rowid ,可以用它标识)

 
多人接受答案了。
 
后退
顶部