ado + sql server 事务的老问题(在线等候) (100分)

  • 主题发起人 flyleaf88
  • 开始时间
F

flyleaf88

Unregistered / Unconfirmed
GUEST, unregistred user!
我找过论坛里所有关于这问题的解答,好象都不了了之,这问题应该是经常碰到的呀
难道都那么保密:)
用adoquery做主从表,两个表都是缓存更新,用事务一起提交,但问题实在是太多,
更改主键,马上出现错误,
事物回滚,无法显示错误,我又不想回到用BDE下:(,谁有比较好的解决方法?还
有一个问题,我用触发器级连删除,更新,不知道谁有用sql server
的关系图来实现?毕竟用这个方便多了
代码如下
存盘前:
myclck.DataModule2.ADOConnection1.BeginTrans;

存盘:with myclck.DataModule2.ADOConnection1 do
begin
try
myclck.DataModule2.q_d_lkd_mx.UpdateBatch();//明细表
myclck.DataModule2.q_pz_lkd.UpdateBatch();//主表
CommitTrans;
BeginTrans
except
RollbackTrans;
BeginTrans;
 
1、最好主表不用批更新,这样就不会出问题
并且,你的提交顺序好象有点问题,主表应该先于从表提交才行。
2、如果是SQL SERVER2000,则可以在企业管理器中为主表建立一个与从表的一对多关系,
并勾选“对INSERT和UPDATE强制关系”的选项及其下的两个子选项就行了。
 
不用批更新,请问怎么写?
我从表先提交也试过了,
建立起对INSERT和UPDATE强制关系,在用事务更新时会出错,这个问题很多人都遇到过
你用什么方法避免的?
 
SQL SERVER勾选“对INSERT和UPDATE强制关系”进行级连删除,更新,
不知能否帮上你!
保存用以下代码
try
ERPdata.ADOConnect.BeginTrans;
ERPdata.Tinv211b1.edit;//从表
ERPdata.Tinv211h1.edit;//主表
ERPdata.Tinv211h1.UpdateBatch(arCurrent);//更新当前主表
ERPdata.Tinv211b1.UpdateBatch(arAll);//更新当前主表下的所有从表
ERPdata.ADOConnect.CommitTrans;
ERPdata.Tinv211b1.Requery;
Application.MessageBox('数据已正确存盘!','存盘结果',MB_OK+MB_IconInformation+MB_SystemModal);
except
ERPdata.ADOConnect.RollbackTrans;
Application.MessageBox('提交存档失败!!','存档结果',MB_OK+MB_Iconstop+MB_SystemModal);
raise;
end;

删除用以下代码,使用一个TQUERY控件,
if Application.MessageBox('真的要删除吗?','警 告',MB_OKCANCEL + MB_DEFBUTTON1)=IDOK then
begin
try
ERPdata.ADOConnect.BeginTrans;
with ADOdelete do
begin
sql.Clear;
sql.add('delete from inv211h1 where lldh_c=:lldh');
Parameters.ParamValues['lldh']:=ERPdata.Tinv211h1.FieldByname('lldh_c').AsString;
ExecSQL;
end;
ERPdata.Tinv211h1.delete;//主表
ERPdata.Tinv211h1.Requery;//主表
ERPdata.ADOConnect.CommitTrans;
Application.MessageBox('数据已删除!','删除结果',MB_OK+MB_IconInformation+MB_SystemModal);
except
ERPdata.ADOConnect.RollbackTrans;
Application.MessageBox('提交删除失败!!','删除结果',MB_OK+MB_Iconstop+MB_SystemModal);
raise;
end;
end;

 
我按你的方法实验过了,可是从表没有提交呀,我用的是delphi 6.0+sqlserver 2000
 
我是自己维护这个关系的!!
 
这是我用的保存数据的过程,从没出过不正常的错误:
with ADOcn do
begin
if not InTransaction then BeginTrans;
try
daset1.UpdateBatch;
daset2.UpdateBatch;
CommitTrans; {on success, commit the changes}
showmessage('已存盘!');
except
on E: Exception do
begin
RollbackTrans; {on failure, undo the changes}
showmessage(E.Message); //showmessage('存盘失败!');
end;
end;
end;
 
ERPdata.Tinv211h1.UpdateBatch(arCurrent);//更新当前主表
ERPdata.Tinv211b1.UpdateBatch(arAll);//更新当前主表下的所有从表
注意:以上代吗,只能保存当前主表及从表的记录,不可以连续修改及保存几笔
主表和其下的从表.我是这样马虎用的。
 
wqxsdly:
可这样,在dbgrid里无法显示从表已经增加的记录呀,从表一增加,从表原来的记录
就不显示了,实际上是存在,但显示不出,不知道你怎么做的?
王老吉:
我用你的方法试了下,从表还是没提交呀,你用的是adoquery吗?
 
代码如下
存盘前:
myclck.DataModule2.ADOConnection1.BeginTrans;

存盘:with myclck.DataModule2.ADOConnection1 do
begin
try
//存盘前:已BeginTrans
myclck.DataModule2.q_d_lkd_mx.UpdateBatch();//明细表
myclck.DataModule2.q_pz_lkd.UpdateBatch();//主表
CommitTrans;
except
RollbackTrans;
end;
 
卡色:
我原来的就是这样写的呀
 
你先为每一个表加一个id字段,是自动增值的,以便表示没一行
然后在adoquery1的afteropen事件中加入
adoquery1.Properties.Item['update criteria'].Value:=upwhereall;
 
我怎么没遇到你说的问题?
在主表上建触发器,主表删除一条纪录,删除对应的从表纪录
 
我说 的 不是删除 亚
更新,新增,显示有问题
 
:hebohb
你的adoquery1指的是主表,我试验过了也不行呀,从表还是显示不出来
 
主表在前;
Note: To use batch updating, the CursorType property of the dataset component must
be either ctKeySet (the default) or ctStatic and the LockType property must be ltBatchOptimistic.
 
按照卡色所说的把TADOdataset正确设置好,按照wiseinfo所说的自己维护表的主从关系,
然后用我说的保存代码保存修改,肯定能行。试一下吧,很简单的。
 
从表也要加上啊
 
难道没有标准的答安?不借助触发器,显示没问题的的解决方法?
 
顶部