数据库事务处理(100分)

  • 主题发起人 主题发起人 zhouyong
  • 开始时间 开始时间
Z

zhouyong

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个数据库事务处理中

d1->StartTransaction();

用与TQUERY相连的数据控件修改数据

d1->Commit();

问题是实际数据库中的用数据控件修改的数据
根本没有相应改变, TQUERY的RequestLive属性
已设为TRUE,而用TQUERY的SQL命令INSERT数据又
可行?请高手指教一下。

 
RequestLive设置成true并不表示该数据集能够被修改. 有很多限制.具体参
见delphi的help.
最好用个TUpdateSql控件连到query上, 用updatesql中相关的sql进行增加,
修改和删除操作.
 
的确如此,不过,你可以在阴性时检查是否可以修改数据。
eYes:人家要用Data Aware 构件改嘛:-)
 


d1->StartTransaction();
//在此有没有下面这两句呢?
d1->Edit;
//修改数据
d1->Post;

d1->Commit();
如果没有,那就是问题之所在了。

不过我建议你还是放弃“RequestLive=True”这种做法,
这等于使用TTable对象,违背了C/S模型的初衷。
而且用“RequestLive=True”操作远端数据表有个天生缺陷,
不信试试如下代码:
创建一个Query1,指向远端表,创建相应的TDataSource,
让RequestLive=True,
在屏幕上放个DBGrid,连上DataSource1,
执行Query1.Append;//或者Query1.Insert;
添加数据,Post;
看看发生了什么?
嘿黑!!!

 
坏蟑螂:
d1->StartTransaction();
//在此有没有下面这两句呢?
d1->Edit; //如果RequestLive=false; 这句就出错,因为read_only。
//修改数据
d1->Post; //如果RequestLive=true; 这句又出错,EDBEngineError with
message 'Nested transactions not supported'.
d1->Commit();

我虽才用CB4编程不久,但在数据库中查找到一个记录,然后进行编辑应是
非常普通的使用,真不知高手们遇到类似问题是怎么弄的。
我用的是interbase;
 
procedure TForm1.ApplyButtonClick(Sender: TObject);

begin
with CustomerQuery do
begin
Database1.StartTransaction;
try
ApplyUpdates; {try to write the updates to the database};
Database1.Commit; {on success, commit the changes};
except
Database1.Rollback; {on failure, undo the changes};
raise; {raise the exception to prevent a call to CommitUpdates!}
end;
CommitUpdates; {on success, clear the cache}
end;

end;
 
谢谢各位的帮助!
 
完了?!
 
没错, 还是用tupdatesql要好得多:-)
 
多人接受答案了。
 
后退
顶部