@@ -47,14 +47,9 @@ EUIBAdapterException = class(EORMAdapterException);
47
47
// / Represents Unified Interbase resultset.
48
48
// / </summary>
49
49
TUIBResultSetAdapter = class (TDriverResultSetAdapter<TUIBDataSet>)
50
- private
51
- fIsNewTransaction: Boolean;
52
50
public
53
51
constructor Create(const dataSet: TUIBDataSet;
54
52
const exceptionHandler: IORMExceptionHandler);
55
- destructor Destroy; override;
56
-
57
- property IsNewTransaction: Boolean read fIsNewTransaction write fIsNewTransaction;
58
53
end ;
59
54
60
55
// / <summary>
@@ -126,17 +121,10 @@ implementation
126
121
constructor TUIBResultSetAdapter.Create(const dataSet: TUIBDataSet;
127
122
const exceptionHandler: IORMExceptionHandler);
128
123
begin
129
- Dataset .OnClose := etmStayIn;
124
+ dataset .OnClose := etmStayIn;
130
125
inherited Create(dataSet, exceptionHandler);
131
126
end ;
132
127
133
- destructor TUIBResultSetAdapter.Destroy;
134
- begin
135
- if fIsNewTransaction then
136
- DataSet.Transaction.Free;
137
- inherited ;
138
- end ;
139
-
140
128
{ $ENDREGION}
141
129
142
130
@@ -163,7 +151,10 @@ function TUIBStatementAdapter.Execute: NativeUInt;
163
151
Statement.Prepare;
164
152
Statement.ExecSQL;
165
153
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);
167
158
except
168
159
raise HandleException;
169
160
end ;
@@ -172,39 +163,24 @@ function TUIBStatementAdapter.Execute: NativeUInt;
172
163
function TUIBStatementAdapter.ExecuteQuery (serverSideCursor: Boolean): IDBResultSet;
173
164
var
174
165
query: TUIBDataSet;
175
- isNewTransaction: Boolean;
176
- transaction: TUIBTransaction;
177
166
adapter: TUIBResultSetAdapter;
178
167
begin
179
168
inherited ;
180
169
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;
193
170
query.Database := Statement.DataBase;
171
+ query.Transaction := Statement.Transaction;
172
+ query.DisableControls;
194
173
query.UniDirectional := True;
195
174
query.SQL.Text := Statement.SQL.Text;
196
175
AssignParams(Statement.Params, query.Params);
197
176
try
198
177
query.Open;
199
178
adapter := TUIBResultSetAdapter.Create(query, ExceptionHandler);
200
- adapter.IsNewTransaction := isNewTransaction;
201
179
Result := adapter;
202
180
except
203
181
on E: Exception do
204
182
begin
205
183
query.Free;
206
- if isNewTransaction then
207
- transaction.Free;
208
184
raise HandleException(Format(SCannotOpenQuery, [E.Message]));
209
185
end ;
210
186
end ;
@@ -238,15 +214,25 @@ procedure TUIBStatementAdapter.SetSQLCommand(const commandText: string);
238
214
239
215
{ $REGION 'TUIBConnectionAdapter'}
240
216
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
+
241
229
destructor TUIBConnectionAdapter.Destroy;
242
230
var
243
231
i: Integer;
244
232
begin
245
233
if Assigned(Connection) then
246
- begin
247
- for i := 0 to Connection.TransactionsCount - 1 do
234
+ for i := Connection.TransactionsCount - 1 downto 0 do
248
235
Connection.Transactions[i].Free;
249
- end ;
250
236
inherited Destroy;
251
237
end ;
252
238
@@ -287,31 +273,16 @@ procedure TUIBConnectionAdapter.Connect;
287
273
end ;
288
274
end ;
289
275
290
- constructor TUIBConnectionAdapter.Create(const connection: TUIBDataBase);
291
- begin
292
- Create(connection, TUIBExceptionHandler.Create);
293
- end ;
294
-
295
276
function TUIBConnectionAdapter.CreateStatement : IDBStatement;
296
277
var
297
278
statement: TUIBStatement;
298
- transaction: TUIBTransaction;
299
279
adapter: TUIBStatementAdapter;
300
280
begin
301
281
if Assigned(Connection) then
302
282
begin
303
283
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
-
313
284
statement.DataBase := Connection;
314
- statement.Transaction := transaction ;
285
+ statement.Transaction := Connection.Transactions[Connection.TransactionsCount - 1 ] ;
315
286
316
287
adapter := TUIBStatementAdapter.Create(statement, ExceptionHandler);
317
288
adapter.ExecutionListeners := ExecutionListeners;
@@ -341,16 +312,6 @@ function TUIBConnectionAdapter.IsConnected: Boolean;
341
312
342
313
{ $REGION 'TUIBTransactionAdapter'}
343
314
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
-
354
315
constructor TUIBTransactionAdapter.Create(const transaction: TUIBTransaction;
355
316
const exceptionHandler: IORMExceptionHandler);
356
317
begin
@@ -370,6 +331,16 @@ destructor TUIBTransactionAdapter.Destroy;
370
331
inherited Destroy;
371
332
end ;
372
333
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
+
373
344
function TUIBTransactionAdapter.InTransaction : Boolean;
374
345
begin
375
346
Result := fTransaction.InTransaction;
0 commit comments