代码如下:function InsertRec(ACode, AName: String): Boolean;
var
DynADOQuery: TADOQuery;
begin
Result := False; DynADOQuery := TADOQuery.Create(Application);
try
DynADOQuery.Connection := MyADOConnection;
DynADOQuery.CacheSize := 500;
if DynADOQuery.CommandTimeout <> 60 then DynADOQuery.CommandTimeout := 60;
if DynADOQuery.CursorLocation <> clUseClient then DynADOQuery.CursorLocation := clUseClient;
DynADOQuery.CursorType := ctStatic;
MyADOConnection.BeginTrans;
try
DynADOQuery.SQL.Clear;
DynADOQuery.SQL.Add(' insert into Table1 (Code, Name) Values (');
DynADOQuery.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
DynADOQuery.SQL.Add(' ''' + Trim(AName) + ''')');
DynADOQuery.ExecSQL; DynADOQuery.SQL.Add(' insert into Table2 (Code, CurMonth) Values (');
DynADOQuery.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
DynADOQuery.SQL.Add(' 0)');
DynADOQuery.ExecSQL; MyADOConnection.CommitTrans;
Result := True;
except
on E: Exception do
begin
CustomMessageBox('添加纪录出错!' + #13#10 + '错误信息:' + E.Message, mtSysError);
MyADOConnection.RollbackTrans;
end;
end;
finally
DynADOQuery.Free;
end;
end;
执行后没有出错,但是发现Insert Table1的纪录没有进入数据库中。而Insert Table2的纪录却进去了。
我于是用MSSQL 的 Query Analyzer 执行Insert Table1的SQL语句却没问题。不知有人碰见过吗?难道ADOConnection的事务处理仅对最后一个执行的SQL语句起作用?想不明白,请高手指点!
var
DynADOQuery: TADOQuery;
begin
Result := False; DynADOQuery := TADOQuery.Create(Application);
try
DynADOQuery.Connection := MyADOConnection;
DynADOQuery.CacheSize := 500;
if DynADOQuery.CommandTimeout <> 60 then DynADOQuery.CommandTimeout := 60;
if DynADOQuery.CursorLocation <> clUseClient then DynADOQuery.CursorLocation := clUseClient;
DynADOQuery.CursorType := ctStatic;
MyADOConnection.BeginTrans;
try
DynADOQuery.SQL.Clear;
DynADOQuery.SQL.Add(' insert into Table1 (Code, Name) Values (');
DynADOQuery.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
DynADOQuery.SQL.Add(' ''' + Trim(AName) + ''')');
DynADOQuery.ExecSQL; DynADOQuery.SQL.Add(' insert into Table2 (Code, CurMonth) Values (');
DynADOQuery.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
DynADOQuery.SQL.Add(' 0)');
DynADOQuery.ExecSQL; MyADOConnection.CommitTrans;
Result := True;
except
on E: Exception do
begin
CustomMessageBox('添加纪录出错!' + #13#10 + '错误信息:' + E.Message, mtSysError);
MyADOConnection.RollbackTrans;
end;
end;
finally
DynADOQuery.Free;
end;
end;
执行后没有出错,但是发现Insert Table1的纪录没有进入数据库中。而Insert Table2的纪录却进去了。
我于是用MSSQL 的 Query Analyzer 执行Insert Table1的SQL语句却没问题。不知有人碰见过吗?难道ADOConnection的事务处理仅对最后一个执行的SQL语句起作用?想不明白,请高手指点!
DynADOQuery.SQL.Add(' insert into Table2 (Code, CurMonth) Values (');
DynADOQuery.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
DynADOQuery.SQL.Add(' 0)');
DynADOQuery.ExecSQL;
我实际程序代码中,有zfmich加的这句(DynADOQuery.SQL.Clear;),才出现我说的这个问题。后来我去掉了这句(DynADOQuery.SQL.Clear;),反而没问题了。但按程序逻辑,去掉了应该反而有问题才对,因为等于Table1插入了两次一样的纪录。但偏偏这样就对了。好像真的就象我上面说的:ADOConnection的事务处理仅对最后一个执行的SQL语句起作用。谢谢zfmich认真看我的代码,还请指点!
var
DynADOQuery: TADOQuery;
i :integer;
begin
Result := False; DynADOQuery := TADOQuery.Create(Application);
try
DynADOQuery.Connection := MyADOConnection;
DynADOQuery.CacheSize := 500;
if DynADOQuery.CommandTimeout <> 60 then DynADOQuery.CommandTimeout := 60;
if DynADOQuery.CursorLocation <> clUseClient then DynADOQuery.CursorLocation := clUseClient;
DynADOQuery.CursorType := ctStatic;
MyADOConnection.BeginTrans ;
try
with DynADOQuery do
begin
Close ;
SQL.Clear ;
SQL.add('insert into table1 (Code, Name) values(:c1,:c2)');
Parameters.ParamByName('c1').value:= ACode;
Parameters.ParamByName('c2').value:= AName;
ExecSQL ;
end ; with DynADOQuery do
begin
Close ;
SQL.Clear ;
SQL.add('insert into table1 (Code, CurMonth) values(:c1,:c2)');
Parameters.ParamByName('c1').value:= ACode;
Parameters.ParamByName('c2').value:= AName;
ExecSQL ;
end ; MyADOConnection.CommitTrans;
Result := True;
except
on E: Exception do
begin
Application.MessageBox(pChar('添加纪录出错!' + #13#10 + '错误信息:' + E.Message), '', 0);
if MyADOConnection.InTransaction then MyADOConnection.RollbackTrans;
end;
end;
finally
DynADOQuery.Free;
end;
end;问题可以解决,但是不知道是什么原因,还望高手出招。
但我在同事的机器上试验时,代码不变却没有发生问题。他用的是:SQLServer2000。 后来我又用两个Query分别添加语句,连续执行,则也没有此问题(见下面代码)。看来还是有办法避开此问题的。只好不做深究了。谢谢你!
function InsertRec(ACode, AName: String): Boolean;
var
DynADOQuery1, DynADOQuery2: TADOQuery;
i :integer;
begin
Result := False; DynADOQuery1 := TADOQuery.Create(Application);
DynADOQuery2 := TADOQuery.Create(Application);
try
DynADOQuery1.Connection := MyADOConnection;
DynADOQuery1.CursorType := ctStatic;
DynADOQuery2.Connection := MyADOConnection;
DynADOQuery2.CursorType := ctStatic; MyADOConnection.BeginTrans ;
try
DynADOQuery1.SQL.Clear;
DynADOQuery1.SQL.Add(' insert into Table1 (Code, Name) Values (');
DynADOQuery1.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
DynADOQuery1.SQL.Add(' ''' + Trim(AName) + ''')'); DynADOQuery2.Clear;
DynADOQuery2.SQL.Add(' insert into Table2 (Code, CurMonth) Values (');
DynADOQuery2.SQL.Add(' ''' + TrimUpper(ACode) + ''',');
DynADOQuery2.SQL.Add(' 0)'); //必须连续执行
DynADOQuery1.ExecSQL;
DynADOQuery2.ExecSQL; MyADOConnection.CommitTrans;
Result := True;
except
on E: Exception do
begin
Application.MessageBox(pChar('添加纪录出错!' + #13#10 + '错误信息:' + E.Message), '', 0);
if MyADOConnection.InTransaction then MyADOConnection.RollbackTrans;
end;
end;
finally
DynADOQuery.Free;
end;
end;问题可以解决,但是同样不知道是什么原因,还望高手出招。