简单的事务处理问题,300分大放送了!!! (300分)

  • 主题发起人 主题发起人 dylb
  • 开始时间 开始时间
D

dylb

Unregistered / Unconfirmed
GUEST, unregistred user!
下列程序原来是没有加事务处理语句的,可以正常Insert数据到几个表中
但是在增加了事务处理语句后就无法Insert数据了,并且RollbackTrans后面的错误提示窗口
也没有显示,程序有点长,请各位高手指点一下!谢谢!!!!
追加: 进行单步调试时查询完全正确执行,及到了
PartNoDM.lhSQLADOQ.Connection.CommitTrans;
这一句后就End结束,并没有触发 Except 后面的错误语句,但是数据还是没有 Insert到数据库中

procedure TPartNoAddForm.AddPartNO;
var
i,ID:integer;
begin
if PartNoDM.lhSQLADOQ.Connection.InTransaction then
PartNoDM.lhSQLADOQ.Connection.CommitTrans;
PartNoDM.lhSQLADOQ.Connection.BeginTrans;
try
PartNoDM.lhSQLADOQ.close;
PartNoDM.lhSQLADOQ.sql.Clear;
PartNoDM.lhSQLADOQ.sql.Add('Insert 料号_基本资料表(料号名称,品名,料号类别,生产类别,属性,录入人员,录入日期)');
PartNoDM.lhSQLADOQ.sql.Add('values(:P0,:P1,:P2,:P3,:P4,:P5,:P6)');
PartNoDM.lhSQLADOQ.sql.Add('select @@Identity as ID');
PartNoDM.lhSQLADOQ.parameters[0].Value:=lhmcEdit.Text;
PartNoDM.lhSQLADOQ.parameters[1].Value:=pmggEdit.Text;
PartNoDM.lhSQLADOQ.parameters[2].Value:=lhlbCBox.Text;
PartNoDM.lhSQLADOQ.parameters[3].Value:=sclbCBox.Text;
PartNoDM.lhSQLADOQ.parameters[4].Value:='新稿';
PartNoDM.lhSQLADOQ.parameters[5].Value:='';
PartNoDM.lhSQLADOQ.parameters[6].Value:=now;
PartNoDM.lhSQLADOQ.Open;
ID:=PartNoDM.lhSQLADOQ.fieldbyname('ID').AsInteger;
PartNoDM.lhSQLADOQ.sql.Clear;
PartNoDM.lhSQLADOQ.sql.Add('Insert 客户_料号对应表(客户ID,料号ID) values(:P0,:P1)');
PartNoDM.lhSQLADOQ.parameters[0].Value:=integer(khmcCBox.Items.Objects[khmccbox.ItemIndex]);
PartNoDM.lhSQLADOQ.parameters[1].Value:=ID;
PartNoDM.lhSQLADOQ.ExecSQL;
PartNoDM.lhSQLADOQ.close;
PartNoDM.lhSQLADOQ.sql.Clear; //加上事务后,从这里开始就导致不再Insert数据了
PartNoDM.lhSQLADOQ.sql.Add('insert 料号_明细资料表(料号ID,长,宽,高,糊盒,糊盒方式,装订,装订方式)');
PartNoDM.lhSQLADOQ.sql.Add('values(:P0,:P1,:P2,:P3,:P4,:P5,:P6,:P7)');
PartNoDM.lhSQLADOQ.parameters[0].Value:=ID;
PartNoDM.lhSQLADOQ.parameters[1].Value:=cdEdit.Text;
PartNoDM.lhSQLADOQ.parameters[2].Value:=kdEdit.Text;
PartNoDM.lhSQLADOQ.parameters[3].value:=gdEdit.Text;
PartNoDM.lhSQLADOQ.parameters[4].Value:=hhCBox.Checked;
PartNoDM.lhSQLADOQ.parameters[5].Value:=hhfsCBox.Text;
PartNoDM.lhSQLADOQ.parameters[6].Value:=zdCBox.Checked;
PartNoDM.lhSQLADOQ.parameters[7].Value:=zdfsCBox.Text;
PartNoDM.lhSQLADOQ.ExecSQL;
PartNoDM.lhSQLADOQ.Close;

PartNoDM.lhSQLADOQ.SQL.Clear;
PartNoDM.lhSQLADOQ.SQL.Add('Insert 料号_部件资料表(料号ID,部件名称,材质ID,印刷,PS版ID,颜色名称,印刷面数,正面色数,');
PartNoDM.lhSQLADOQ.SQL.Add('反面色数,印刷长度,印刷宽度,台数,模数,上光,上光方式,裱浪,裱浪方式,裱浪材质,裱浪长度,');
PartNoDM.lhSQLADOQ.SQL.Add('裱浪宽度,轧盒,刀模ID,裁切,裁切长度,裁切宽度,折纸,折纸方式,单独打印,关键部件,委外,附件)');
PartNoDM.lhSQLADOQ.SQL.Add('values(:P0,:P1,:P2,:P3,:P4,:P5,:P6,:P7,:P8,:P9,:P10,:P11,:P12,:P13,:P14,:P15,:P16,:P17,');
PartNoDM.lhSQLADOQ.SQL.Add(':P18,:P19,:P20,:P21,:P22,:P23,:P24,:P25,:P26,:P27,:P28,:P29,:P30)');

for i:=0 to bjPageControl.PageCount-1 do
begin
with FindComponent('bj'+bjpageControl.Pages.Name) as TPartFrame do
begin
PartNoDM.lhSQLADOQ.Parameters[0].Value:=ID;
PartNoDM.lhSQLADOQ.Parameters[1].Value:=bjmcEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[2].Value:=mzczEdit.Tag;
PartNoDM.lhSQLADOQ.Parameters[3].Value:=ysCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[4].Value:=psbhEdit.Tag;
PartNoDM.lhSQLADOQ.Parameters[5].Value:=ysmcCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[6].Value:=smRBtn.Checked;
PartNoDM.lhSQLADOQ.Parameters[7].Value:=zmEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[8].Value:=fmEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[9].Value:=yscdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[10].Value:=yskdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[11].Value:=tsEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[12].Value:=msEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[13].Value:=sgCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[14].Value:=sgfsCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[15].Value:=blCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[16].Value:=blfsCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[17].Value:=blczCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[18].Value:=blcdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[19].Value:=blkdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[20].Value:=zhCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[21].Value:=dmEdit.Tag;
PartNoDM.lhSQLADOQ.Parameters[22].Value:=cqCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[23].Value:=cqcdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[24].Value:=cqkdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[25].Value:=zzCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[26].Value:=zzfsCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[27].Value:=dddyCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[28].Value:=gjbjCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[29].Value:=wwjgCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[30].Value:=fjCBox.Checked;
PartNoDM.lhSQLADOQ.ExecSQL;
end;
end;
PartNoDM.lhSQLADOQ.close;
PartNoDM.lhSQLADOQ.Connection.CommitTrans;
except
PartNoDM.lhSQLADOQ.Connection.RollbackTrans;
messagedlg('由于数据库突发性错误,新增料号资料的请求被取消,请重新尝试',mterror,[mbok],0);
end;
end;
 
插一个题外话:
为什么我不能提问?按提问时,在弹出的页面总是提示说我没有登陆,可我明明登陆了啊?
各位有谁知道原因的,跟我说一声。
谢谢。
 
建议COOKIE删掉重新来过:)
 
可以在事件探查器中看到所有的更新语句和事务语句
有没有更新一目了然
 
你是否用SQL7
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1861574
看看此问题就知
 
PartNoDM.lhSQLADOQ.parameters[4].Value:='新稿';
PartNoDM.lhSQLADOQ.parameters[5].Value:='';
PartNoDM.lhSQLADOQ.parameters[6].Value:=now;
PartNoDM.lhSQLADOQ.Open;
^^^^^^
改为 PartNoDM.lhSQLADOQ.execute 试试
我也发现过上述问题,注意 open 和 exec 的区别
 
To:yym
那个帖子的讨论还没有结束,也没有一个明确的答案

To:Tomi
使用 Open 而不用 ExecSQL 原因是我要立即取得 @@identity 的值
使用 ExecSQL 后,下一句
ID:=PartNoDM.lhSQLADOQ.fieldbyname('ID').AsInteger;
会报错!!! 因为 ExecSQL 不返回结果!!!!
 
procedure TPartNoAddForm.AddPartNO;
var
i,ID:integer;
begin
if PartNoDM.lhSQLADOQ.Connection.InTransaction then
PartNoDM.lhSQLADOQ.Connection.CommitTrans;
PartNoDM.lhSQLADOQ.Connection.BeginTrans;
try
PartNoDM.lhSQLADOQ.close;
PartNoDM.lhSQLADOQ.sql.Clear;
PartNoDM.lhSQLADOQ.sql.Add('Insert 料号_基本资料表(料号名称,品名,料号类别,生产类别,属性,录入人员,录入日期)');
PartNoDM.lhSQLADOQ.sql.Add('values(:P0,:P1,:P2,:P3,:P4,:P5,:P6)');
PartNoDM.lhSQLADOQ.sql.Add('select @@Identity as ID');
PartNoDM.lhSQLADOQ.parameters[0].Value:=lhmcEdit.Text;
PartNoDM.lhSQLADOQ.parameters[1].Value:=pmggEdit.Text;
PartNoDM.lhSQLADOQ.parameters[2].Value:=lhlbCBox.Text;
PartNoDM.lhSQLADOQ.parameters[3].Value:=sclbCBox.Text;
PartNoDM.lhSQLADOQ.parameters[4].Value:='新稿';
PartNoDM.lhSQLADOQ.parameters[5].Value:='';
PartNoDM.lhSQLADOQ.parameters[6].Value:=now;
PartNoDM.lhSQLADOQ.Open;//---------------->用execsql;
ID:=PartNoDM.lhSQLADOQ.fieldbyname('ID').AsInteger;
PartNoDM.lhSQLADOQ.sql.Clear;
PartNoDM.lhSQLADOQ.sql.Add('Insert 客户_料号对应表(客户ID,料号ID) values(:P0,:P1)');
PartNoDM.lhSQLADOQ.parameters[0].Value:=integer(khmcCBox.Items.Objects[khmccbox.ItemIndex]);
PartNoDM.lhSQLADOQ.parameters[1].Value:=ID;
PartNoDM.lhSQLADOQ.ExecSQL;
PartNoDM.lhSQLADOQ.close;
PartNoDM.lhSQLADOQ.sql.Clear; //加上事务后,从这里开始就导致不再Insert数据了
PartNoDM.lhSQLADOQ.sql.Add('insert 料号_明细资料表(料号ID,长,宽,高,糊盒,糊盒方式,装订,装订方式)');
PartNoDM.lhSQLADOQ.sql.Add('values(:P0,:P1,:P2,:P3,:P4,:P5,:P6,:P7)');
PartNoDM.lhSQLADOQ.parameters[0].Value:=ID;
PartNoDM.lhSQLADOQ.parameters[1].Value:=cdEdit.Text;
PartNoDM.lhSQLADOQ.parameters[2].Value:=kdEdit.Text;
PartNoDM.lhSQLADOQ.parameters[3].value:=gdEdit.Text;
PartNoDM.lhSQLADOQ.parameters[4].Value:=hhCBox.Checked;
PartNoDM.lhSQLADOQ.parameters[5].Value:=hhfsCBox.Text;
PartNoDM.lhSQLADOQ.parameters[6].Value:=zdCBox.Checked;
PartNoDM.lhSQLADOQ.parameters[7].Value:=zdfsCBox.Text;
PartNoDM.lhSQLADOQ.ExecSQL;
PartNoDM.lhSQLADOQ.Close;

PartNoDM.lhSQLADOQ.SQL.Clear;
PartNoDM.lhSQLADOQ.SQL.Add('Insert 料号_部件资料表(料号ID,部件名称,材质ID,印刷,PS版ID,颜色名称,印刷面数,正面色数,');
PartNoDM.lhSQLADOQ.SQL.Add('反面色数,印刷长度,印刷宽度,台数,模数,上光,上光方式,裱浪,裱浪方式,裱浪材质,裱浪长度,');
PartNoDM.lhSQLADOQ.SQL.Add('裱浪宽度,轧盒,刀模ID,裁切,裁切长度,裁切宽度,折纸,折纸方式,单独打印,关键部件,委外,附件)');
PartNoDM.lhSQLADOQ.SQL.Add('values(:P0,:P1,:P2,:P3,:P4,:P5,:P6,:P7,:P8,:P9,:P10,:P11,:P12,:P13,:P14,:P15,:P16,:P17,');
PartNoDM.lhSQLADOQ.SQL.Add(':P18,:P19,:P20,:P21,:P22,:P23,:P24,:P25,:P26,:P27,:P28,:P29,:P30)');

for i:=0 to bjPageControl.PageCount-1 do
begin
with FindComponent('bj'+bjpageControl.Pages.Name) as TPartFrame do
begin
PartNoDM.lhSQLADOQ.Parameters[0].Value:=ID;
PartNoDM.lhSQLADOQ.Parameters[1].Value:=bjmcEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[2].Value:=mzczEdit.Tag;
PartNoDM.lhSQLADOQ.Parameters[3].Value:=ysCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[4].Value:=psbhEdit.Tag;
PartNoDM.lhSQLADOQ.Parameters[5].Value:=ysmcCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[6].Value:=smRBtn.Checked;
PartNoDM.lhSQLADOQ.Parameters[7].Value:=zmEdit.Text;
PartNoDM.lhSQLADOQ.Parameters.Value:=fmEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[9].Value:=yscdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[10].Value:=yskdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[11].Value:=tsEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[12].Value:=msEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[13].Value:=sgCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[14].Value:=sgfsCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[15].Value:=blCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[16].Value:=blfsCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[17].Value:=blczCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[18].Value:=blcdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[19].Value:=blkdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[20].Value:=zhCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[21].Value:=dmEdit.Tag;
PartNoDM.lhSQLADOQ.Parameters[22].Value:=cqCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[23].Value:=cqcdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[24].Value:=cqkdEdit.Text;
PartNoDM.lhSQLADOQ.Parameters[25].Value:=zzCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[26].Value:=zzfsCBox.Text;
PartNoDM.lhSQLADOQ.Parameters[27].Value:=dddyCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[28].Value:=gjbjCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[29].Value:=wwjgCBox.Checked;
PartNoDM.lhSQLADOQ.Parameters[30].Value:=fjCBox.Checked;
PartNoDM.lhSQLADOQ.ExecSQL;
end;
end;
PartNoDM.lhSQLADOQ.close;
PartNoDM.lhSQLADOQ.Connection.CommitTrans;
except
PartNoDM.lhSQLADOQ.Connection.RollbackTrans;
messagedlg('由于数据库突发性错误,新增料号资料的请求被取消,请重新尝试',mterror,[mbok],0);
end;
end;
具体报什么错
 
最简单的加事务方法:
在query的beforepost中开始事务
afterpost 确认事务
posterror 回滚事务 并且action:=daabort;
 
with PartNoDM.lhSQLADOQ do
begin
Close;
Clear;
sql.Add('Insert 料号_基本资料表(料号名称,品名,料号类别,生产类别,属性,录入人员,录入日期)');
sql.Add('values(:P0,:P1,:P2,:P3,:P4,:P5,:P6)');
execsql;
Close; Clear;
sql.Add('select @@Identity as ID');
Open;
ID:=fieldbyname('ID').AsInteger;
Close; Clear;
sql.Add('Insert 客户_料号对应表(客户ID,料号ID) values(:P0,:P1)');
execsql;
....('insert 料号_明细资料表
end;
 
我的问题已解决了,你的若是SQL7只要安装如下的补丁即可,我刚装的
http://download.microsoft.com/download/sql70/SP/7.00.1063/W98NT42KMeXP/EN-US/sql70sp4.exe
 
感谢yym兄弟,安装SP4后问题解决了
 
后退
顶部