diff --git a/packages/fcl-db/src/sqldb/sqldb.pp b/packages/fcl-db/src/sqldb/sqldb.pp index 5a24be9369..79034b2fda 100644 --- a/packages/fcl-db/src/sqldb/sqldb.pp +++ b/packages/fcl-db/src/sqldb/sqldb.pp @@ -225,7 +225,6 @@ type FTransaction: TSQLTransaction; FDatasource : TDatasource; FParseSQL: Boolean; - procedure DoUnPrepare; procedure OnChangeSQL(Sender : TObject); procedure SetDatabase(AValue: TSQLConnection); procedure SetDataSource(AValue: TDatasource); @@ -238,6 +237,7 @@ type Function IsSelectable : Boolean ; virtual; Procedure DoExecute; virtual; procedure DoPrepare; virtual; + procedure DoUnPrepare; virtual; Function CreateParams : TParams; virtual; Function LogEvent(EventType : TDBEventType) : Boolean; Procedure Log(EventType : TDBEventType; Const Msg : String); virtual; @@ -644,7 +644,6 @@ procedure TCustomSQLStatement.SetDatabase(AValue: TSQLConnection); begin if FDatabase=AValue then Exit; UnPrepare; - if assigned(FCursor) then TSQLConnection(DataBase).DeAllocateCursorHandle(FCursor); If Assigned(FDatabase) then FDatabase.RemoveFreeNotification(Self); FDatabase:=AValue; @@ -825,8 +824,14 @@ end; procedure TCustomSQLStatement.DoUnPrepare; begin - If Assigned(Database) then - DataBase.UnPrepareStatement(FCursor); + If Assigned(FCursor) then + If Assigned(Database) then + begin + DataBase.UnPrepareStatement(FCursor); + DataBase.DeAllocateCursorHandle(FCursor); + end + else // this should never happen. It means a cursor handle leaks in the DB itself. + FreeAndNil(FCursor); end; procedure TCustomSQLStatement.Unprepare;