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所说的自己维护表的主从关系,
然后用我说的保存代码保存修改,肯定能行。试一下吧,很简单的。
 
从表也要加上啊
 
难道没有标准的答安?不借助触发器,显示没问题的的解决方法?
 
后退
顶部