@@ -47,14 +47,9 @@ EUIBAdapterException = class(EORMAdapterException);
4747 // / Represents Unified Interbase resultset.
4848 // / </summary>
4949 TUIBResultSetAdapter = class (TDriverResultSetAdapter<TUIBDataSet>)
50- private
51- fIsNewTransaction: Boolean;
5250 public
5351 constructor Create(const dataSet: TUIBDataSet;
5452 const exceptionHandler: IORMExceptionHandler);
55- destructor Destroy; override;
56-
57- property IsNewTransaction: Boolean read fIsNewTransaction write fIsNewTransaction;
5853 end ;
5954
6055 // / <summary>
@@ -126,17 +121,10 @@ implementation
126121constructor TUIBResultSetAdapter.Create(const dataSet: TUIBDataSet;
127122 const exceptionHandler: IORMExceptionHandler);
128123begin
129- Dataset .OnClose := etmStayIn;
124+ dataset .OnClose := etmStayIn;
130125 inherited Create(dataSet, exceptionHandler);
131126end ;
132127
133- destructor TUIBResultSetAdapter.Destroy;
134- begin
135- if fIsNewTransaction then
136- DataSet.Transaction.Free;
137- inherited ;
138- end ;
139-
140128{ $ENDREGION}
141129
142130
@@ -163,7 +151,10 @@ function TUIBStatementAdapter.Execute: NativeUInt;
163151 Statement.Prepare;
164152 Statement.ExecSQL;
165153 Result := Statement.RowsAffected;
166- Statement.Close(etmStayIn);
154+ if Statement.Transaction = Statement.DataBase.Transactions[0 ] then
155+ Statement.Close(etmCommit)
156+ else
157+ Statement.Close(etmStayIn);
167158 except
168159 raise HandleException;
169160 end ;
@@ -172,39 +163,24 @@ function TUIBStatementAdapter.Execute: NativeUInt;
172163function TUIBStatementAdapter.ExecuteQuery (serverSideCursor: Boolean): IDBResultSet;
173164var
174165 query: TUIBDataSet;
175- isNewTransaction: Boolean;
176- transaction: TUIBTransaction;
177166 adapter: TUIBResultSetAdapter;
178167begin
179168 inherited ;
180169 query := TUIBDataSet.Create(nil );
181- isNewTransaction := Statement.DataBase.TransactionsCount < 1 ;
182- if not isNewTransaction then
183- transaction := Statement.DataBase.Transactions[0 ]
184- else
185- begin
186- transaction := TUIBTransaction.Create(nil );
187- transaction.DefaultAction := etmRollback;
188- transaction.DataBase := Statement.DataBase;
189- end ;
190- transaction.DefaultAction := etmRollback;
191- query.DisableControls;
192- query.Transaction := transaction;
193170 query.Database := Statement.DataBase;
171+ query.Transaction := Statement.Transaction;
172+ query.DisableControls;
194173 query.UniDirectional := True;
195174 query.SQL.Text := Statement.SQL.Text;
196175 AssignParams(Statement.Params, query.Params);
197176 try
198177 query.Open;
199178 adapter := TUIBResultSetAdapter.Create(query, ExceptionHandler);
200- adapter.IsNewTransaction := isNewTransaction;
201179 Result := adapter;
202180 except
203181 on E: Exception do
204182 begin
205183 query.Free;
206- if isNewTransaction then
207- transaction.Free;
208184 raise HandleException(Format(SCannotOpenQuery, [E.Message]));
209185 end ;
210186 end ;
@@ -238,15 +214,25 @@ procedure TUIBStatementAdapter.SetSQLCommand(const commandText: string);
238214
239215{ $REGION 'TUIBConnectionAdapter'}
240216
217+ constructor TUIBConnectionAdapter.Create(const connection: TUIBDataBase);
218+ var
219+ transaction: TUIBTransaction;
220+ begin
221+ Create(connection, TUIBExceptionHandler.Create);
222+ if connection.TransactionsCount = 0 then
223+ begin
224+ transaction := TUIBTransaction.Create(nil );
225+ transaction.DataBase := connection;
226+ end ;
227+ end ;
228+
241229destructor TUIBConnectionAdapter.Destroy;
242230var
243231 i: Integer;
244232begin
245233 if Assigned(Connection) then
246- begin
247- for i := 0 to Connection.TransactionsCount - 1 do
234+ for i := Connection.TransactionsCount - 1 downto 0 do
248235 Connection.Transactions[i].Free;
249- end ;
250236 inherited Destroy;
251237end ;
252238
@@ -287,31 +273,16 @@ procedure TUIBConnectionAdapter.Connect;
287273 end ;
288274end ;
289275
290- constructor TUIBConnectionAdapter.Create(const connection: TUIBDataBase);
291- begin
292- Create(connection, TUIBExceptionHandler.Create);
293- end ;
294-
295276function TUIBConnectionAdapter.CreateStatement : IDBStatement;
296277var
297278 statement: TUIBStatement;
298- transaction: TUIBTransaction;
299279 adapter: TUIBStatementAdapter;
300280begin
301281 if Assigned(Connection) then
302282 begin
303283 statement := TUIBStatement.Create(nil );
304- if Connection.TransactionsCount > 0 then
305- transaction := Connection.Transactions[Connection.TransactionsCount - 1 ]
306- else
307- begin
308- transaction := TUIBTransaction.Create(nil );
309- transaction.DefaultAction := etmRollback;
310- transaction.DataBase := Connection;
311- end ;
312-
313284 statement.DataBase := Connection;
314- statement.Transaction := transaction ;
285+ statement.Transaction := Connection.Transactions[Connection.TransactionsCount - 1 ] ;
315286
316287 adapter := TUIBStatementAdapter.Create(statement, ExceptionHandler);
317288 adapter.ExecutionListeners := ExecutionListeners;
@@ -341,16 +312,6 @@ function TUIBConnectionAdapter.IsConnected: Boolean;
341312
342313{ $REGION 'TUIBTransactionAdapter'}
343314
344- procedure TUIBTransactionAdapter.Commit ;
345- begin
346- if Assigned(fTransaction) then
347- try
348- fTransaction.Commit;
349- except
350- raise HandleException;
351- end ;
352- end ;
353-
354315constructor TUIBTransactionAdapter.Create(const transaction: TUIBTransaction;
355316 const exceptionHandler: IORMExceptionHandler);
356317begin
@@ -370,6 +331,16 @@ destructor TUIBTransactionAdapter.Destroy;
370331 inherited Destroy;
371332end ;
372333
334+ procedure TUIBTransactionAdapter.Commit ;
335+ begin
336+ if Assigned(fTransaction) then
337+ try
338+ fTransaction.Commit;
339+ except
340+ raise HandleException;
341+ end ;
342+ end ;
343+
373344function TUIBTransactionAdapter.InTransaction : Boolean;
374345begin
375346 Result := fTransaction.InTransaction;
0 commit comments