走一走,看一看,各位大哥,小弟有重要问题请教,请各位大哥帮忙
我想点新增时同时新增主表,从表数据,主表用DB控件,从表用DBGrid;
把主表和从表的ADO都LockType 为ltBatchOptimistic;从表的sql语句是这样写的,SELECT *
FROM dbo.T3 where a1=:a2;a1为从表中主表ID,
然后把从表的ADO的datasource为主表的datasource
在新增按钮时写的,主从表的ADO分别APPEND
然后在保存按钮时写主从表的ADO的UpdateBatch ,
主表记录有保存进去,但从表记录没有保存进去啊。
请有经验的大哥发表一个意见,多谢了.....
[解决办法]
use transaction
ADOConnection.BeginTrans;
----------------------
your code
----------------------
ADOQuery1.UpdateBatch;
ADOConnection.CommitTrans;
[解决办法]
ADOConnection1.BeginTrans;
try
s:= 'insert into detail(zj,bh,mc,clz,mbz,pcz) values(:zj,:bh,:mc,:clz,:mbz,:pcz) '; //从表
with inst_qry do begin
close;
sql.Clear;
sql.Add(s);
for i:=2 to dt_stg.rowcount-1 do
begin
for j:=1 to 5 do t[j]:=dt_stg.cells[j-1,i]; //stringgrid为录入的从表记录
close;
parameters.ParamByName( 'zj ').Value:=trim(zj_edt.Text); //主键
parameters.ParamByName( 'bh ').Value:=t[1]; //序号
parameters.ParamByName( 'mc ').Value:=t[2];
parameters.ParamByName( 'clz ').Value:=t[3];
parameters.ParamByName( 'mbz ').Value:=t[4];
parameters.ParamByName( 'pcz ').Value:=t[5];
execsql;
end;
end;
s:= 'insert into master(zj,rq,memo,czydm) values(:zj,:rq,:memo,:czydm) '; //主表
with inst_qry do begin
close;
sql.Clear;
sql.Add(s);
parameters.ParamByName( 'zj ').Value:=trim(zj_edt.Text); //主键
parameters.ParamByName( 'rq ').Value:=rq_dtp.date;
parameters.ParamByName( 'memo ').Value:=trim(memo_edt.Text);
parameters.ParamByName( 'czydm ').Value:=czydm;
execsql;
end;
ADOConnection1.CommitTrans;
showmessage( '保存成功! ');
except
ADOConnection1.RollbackTrans;
showmessage( '保存出错! ');
end;
这里没有使用关联,没有用dbgrid录入记录
[解决办法]
不用那麼復雜,設置以下屬性即可:
增加一個datasource1,其dataset屬性指向主表數據集,
從表數據集的 datasource := datasource1,
設置從表數據集的 indexfields ,設置從表數據集的masterfields為主表數據集的某個字段,要與indexfields一致。
主.open;
從.open;
[解决办法]
这主要是因为你使用了DataSource数据控件,它要求数据集必须是连通的才可以执行,要保存主从表有两种解决方法:1、用两个Adoquery,一个执行主表,与DataSource关联;另一个对从表执行SQL语句。 2、两个表分开执行,先保存主表,然后释放DataSource字段,在Post成功后,对从表执行SQL语句,然后再关联上主表,重新对主表连接上DataSource,至此OK!
建议使用第一种,方法简便点。
第二种属于全动态设计的,可以少用一个Query,只是设计时麻烦些。
[解决办法]
用事务提交.
AdoDataSet的属性 Locktype 为 ltBatchOptimistic
....
....{LZ自己的代码包括插入等}
....
ADODataSet1.post;
....
....
....
ADODataSet2.Post;
ADOConnection1.BeginTrans;
try
ADODataset1.UpdateBatch;
ADODataset2.UpdateBatch;
ADOConnection1.CommitTrans;
showmessage( '保存成功! ');
except
ADOConnection1.RollbackTrans;
showmessage( '保存出错! ');
end;