// ******************************************************************************
// 函数功能: 事务执行SQL语句列表。
// 函数名称: cf_dbExeSQLsTrans
// 函数参数: oADOConnection TADOConnection 数据库连接对象。
// oSqls TStringList 数据库连接字符串
// 返回值: 返回是否操作成功(Boolean);
// ******************************************************************************
function cf_dbExeSQLsTrans(sSqls: String;
oADOConnection: TADOConnection = nil): Boolean; overload;
var
iSqls, iCount: Integer;
oADOQuery: TADOQuery;
_oADOConnection: TADOConnection;
sSQL, sException: string;
begin
Result := false;
sException := '';
_oADOConnection := TADOConnection.Create(nil);
if (oADOConnection = nil) or (Trim(oADOConnection.ConnectionString) = '')
then
begin
if (goADOConDef <> nil) and (Trim(goADOConDef.ConnectionString) <> '')
then
begin
oADOConnection := goADOConDef;
end
else
begin
Result := false;
Exit;
end;
end
else
begin
if (goADOConDef <> nil) and (Trim(goADOConDef.ConnectionString) = '')
then
begin
if goADOConDef.Connected then
goADOConDef.Connected := false;
goADOConDef.ConnectionString := oADOConnection.ConnectionString;
goADOConDef.LoginPrompt := false;
if not goADOConDef.Connected then
goADOConDef.Open;
end
else if (goADOConDef = nil) and
(Trim(goADOConDef.ConnectionString) = '') then
begin
goADOConDef := TADOConnection(Application);
goADOConDef.LoginPrompt := false;
goADOConDef.ConnectionString := oADOConnection.ConnectionString;
if not goADOConDef.Connected then
goADOConDef.Open;
end;
end;
if oADOConnection = nil then
begin
Result := false;
Exit;
end;
if _oADOConnection.Connected then
_oADOConnection.Close;
_oADOConnection.ConnectionString := oADOConnection.ConnectionString;
_oADOConnection.ConnectionTimeout := 2000;
_oADOConnection.LoginPrompt := false;
// 完全隔离级别。
_oADOConnection.IsolationLevel := ilSerializable;
_oADOConnection.Open;
// 数据库查询语句
if (sSqls = '') and (Pos(';', sSqls) <= 0) then
Exit;
//
sSqls := sSqls + ';';
iSqls := cf_valGetStrPosNum(sSqls, ';') - 1;
oADOQuery := TADOQuery.Create(nil);
try
try
oADOQuery.Connection := _oADOConnection;
_oADOConnection.BeginTrans;
for iCount := 1 to iSqls do
begin
try
if oADOQuery.Active then
oADOQuery.Close;
oADOQuery.SQL.Clear;
sSQL := cf_valGetStrPosStr(sSqls, iCount, ';');
// 不存在Sql语句。
if Trim(sSQL) = '' then
Continue;
oADOQuery.SQL.ADD(sSQL);
oADOQuery.ExecSQL;
except
on E: Exception do
begin
sException := E.Message;
_oADOConnection.RollbackTrans;
cf_sysLog('事务执行SQL语句列表函数过程失败,引起会滚! 错误位置:[' +
'function cf_dbExeSQLsTrans(sSqls: String;oADOConnection: TADOConnection = nil): Boolean; overload;] 执行SQL:[' + sSQL + '] 引发异常:[' + sException + ']');
Exit;
end;
end;
end;
Result := true;
_oADOConnection.CommitTrans;
except
_oADOConnection.RollbackTrans;
cf_sysLog('事务执行SQL语句列表函数过程失败,引起会滚! 错误位置:[' +
'function cf_dbExeSQLsTrans(sSqls: String;oADOConnection: TADOConnection = nil): Boolean; overload;]');
end;
finally
if oADOQuery.Active then
oADOQuery.Close;
if _oADOConnection.Connected then
_oADOConnection.Close;
oADOQuery.Free;
_oADOConnection.Free;
end;
end;