请教关于Query中,CachedUpdates的用法(100分)

  • 主题发起人 主题发起人 lxh
  • 开始时间 开始时间
L

lxh

Unregistered / Unconfirmed
GUEST, unregistred user!
Query1.CachedUpdates:=true;
for i:=0 to 10 do
begin
Query1.Close;
Query1.ParamByName('StockCode').Asstring:='01'+inttostr(i);
Query1.ParamByName('StockName').Asstring:='发展';
Query1.ParamByName('StockPY').Asstring:='sfz'+inttostr(i);
Query1.ParamByName('ExChange').AsInteger:=1;
Query1.ExecSQL;
end;
Query1.ApplyUpdates;
程序执行到ExceSQL时,就写了数据,根本没有缓冲。
执行ApplyUpdates时出错如下:

Dataset not in Edit or in insert mode.
 
ExceSql 是把数据写到缓冲区了!
而Apllyudates才是把数据写到数据库!
 
applyupdate是对打开了的query里的数据集进行修改,并且cacheupdate置为true时才用的到.
只有用select语句的query才能open, 因为有select的语句才返回数据集.
 
我用的是SQL SERVER6。5
sql是这样的insert PY values(:StockCode,:StockName,:StockPY,:ExChange)
执行完
Query1.ExecSQL;
这句后我用SQL MANAGER 看
数据已经入库。
delphi fan2 的回答与我的想法相同
,但执行结果不一样.
 
本人同意Another_eYes的看法,CachedUpdates仅对Select语句有效!
 
是Open对select有效;
ExceSql对其他语句有效!
我也遇到过这个问题,在设计是设置CachedUpdates:=true;
 
可以这么写
DataBase1.StartTransaction;
try
with Query1 do
begin
sql.add('insert.......');
execsql;
ApplyUpdates;
end;
DataBase1.Commit;
except
DataBase1.Rollback;
raise;
end;
QUery1.CommitUpdates;
end;
ApplyUpdates 是把BDE/IDAPI中的缓冲池的数据写到后台数据库
CommitUpdates是清除前台BDE/IDAPI缓冲池数据
 
ExeSQL是直接执行SQL语句,而与CachedUpdates没有任何关系。

CachedUpdates是指对TTable或TQuery中的已修改的数据进行缓存,直到调用
ApplyUpdates.

ApplyUpdates是对TQuery或TTable中已修改,但为提交的数据进行提交,
并且只有在TQuery或TTable对象的CachedUpdates=True且Active=True,
State=dsbrowse时才能调用。

TQuery的CachedUpdates必须陪合TUpdateSQL控件才能使用。
例如:
Query1.SQL.Text:='select field1,field2 from table1';
Query1.CachedUpdates:=True;
Query1.UpdateObject:=UpdateSQL1;
UpdateSQL1.InsertSQL:='insert table1(field1,field2) values (:field1,:field2)';
UpdateSQL1.deleteSQL:='delete from table1 where field1=:field1,field2=:field2';
UpdateSQL1.ModifySQL:='update table1 set field1=:field1,field2=:field2 where field1=:old_field1 and field2=:old_field2;

Query1.Open;
Query1.First;
while not Query1.Eof do begin
Query1.Edit;
Query1.FieldByName('field1').AsString:='123';
Query1.Post; //此时数据并未提交到后台。
Query1.Next;
end;
Query1.Database.StartTransaction
try
Query1.ApplyUpdates;
Query1.Database.Commit;
except
Query1.Database.Rollbback;
raise;
end;
Query1.CommitUpdates;

祝各位新年快乐!



 
是否insert不能CachedUpdates.
但是delphi 3的help里,是这样写的
When cached updates are enabled, updates to a dataset (such as posting changes,
inserting new records, //应该可以insert
or deleting records), are stored in an internal cache on the client machine instead of being written directly to the dataset抯 underlying database tables. When changes are complete, an application writes all cached changes to the database in the context of a single transaction.

 
问题部分解决:如lzx所说:
Query1.CachedUpdates:=true;
Query1.Open;
for i:=0 to 10 do
begin
Query1.Insert;
Query1.FieldByName('StockCode').Asstring:='01'+inttostr(i);
Query1.FieldByName('StockName').Asstring:='发展';
Query1.FieldByName('StockPY').Asstring:='sfz'+inttostr(i);
Query1.FieldByName('ExChange').AsInteger:=1;
Query1.Post;
end;
Database1.ApplyUpdates([Query1]);
但是还有疑问请教:
UpdateSQL1.ModifySQL:='update table1 set field1=:field1,field2=:field2 where field1=:old_field1 and field2=:old_field2;
在程序中如何向old_field1,old_field2赋值

 
TQuery是支持Insert,Modify,Delete的,当调用ApplyUpdates时,
UpdateSQL配合TQuery生成三类SQL语句进行提交,
UpdateSQL中的参数不需要程序赋值,赋值由UpdateSQL和TQuery,BDE三者
共同完成,包括 :field1,:field2...
:old_field1,:old_field2....
 
UpdateSql是与Query配合使用,Query有个属性是连接UpdateSql的,
当向数据库回写是自动调用!:Old_field为数据库里的值。
 
我的程序的功能是将交易所的行情数据实时的
写到SQL Server中,
我的Query不可能捆绑DBGrid,
当我Update时,以股票代码为关键字
我也不能象jzy的例子中那样,
next 一条,post 一条,肯定影响速度。

看来CachedUpdates不象想象的那样好。
 
如果实时性插入,例子如下

Query1.SQL.Text:='insert into table1(StockCode,StockName...) values(:StockCode,:StockName...)';
Query1.Params.CreateParam(ftString,'StockCode',ptInput);
Query1.Params.CreateParam(ftString,'StockName',ptInput);
...


DataBase1.StartTransaction;
try
for i:=0 to 10 do
begin
Query1.ParamByName('StockCode').Asstring:='01'+inttostr(i);
Query1.ParamByName('StockName').Asstring:='发展';
Query1.ParamByName('StockPY').Asstring:='sfz'+inttostr(i);
Query1.ParamByName('ExChange').AsInteger:=1;
Query1.ExecSQL;
end;
DataBase1.Commit;
except
Database.Rollback;
raise;
end;


 
我想答案应该有了! 可以结束了.
 
若在Tquery上产生Lookup字段,则在Delete后ApplyUpdates会出现
"UpdateSQL***: update failed"的提示,请问各位有何高招?
 
后退
顶部