浏览代码

* When a dataset is closed and it is not prepared it is assumed that a
problem occured, and unprepare is called to clean everything up. But in
case the dataset is read from a data-packet, the dataset is also not
prepared but no problem occured, so do not call unprepare
* Always use AllocateCursorHandle to allocate a cursor, or else its type
can be different from what the connection expects

git-svn-id: trunk@13397 -

joost 16 年之前
父节点
当前提交
3f98f6a5d0
共有 1 个文件被更改,包括 8 次插入4 次删除
  1. 8 4
      packages/fcl-db/src/sqldb/sqldb.pp

+ 8 - 4
packages/fcl-db/src/sqldb/sqldb.pp

@@ -1026,9 +1026,12 @@ end;
 
 procedure TCustomSQLQuery.InternalClose;
 begin
-  if StatementType in [stSelect,stExecProcedure] then FreeFldBuffers;
-// Database and FCursor could be nil, for example if the database is not assigned, and .open is called
-  if (not IsPrepared) and (assigned(database)) and (assigned(FCursor)) then TSQLConnection(database).UnPrepareStatement(FCursor);
+  if not IsReadFromPacket then
+    begin
+    if StatementType in [stSelect,stExecProcedure] then FreeFldBuffers;
+    // Database and FCursor could be nil, for example if the database is not assigned, and .open is called
+    if (not IsPrepared) and (assigned(database)) and (assigned(FCursor)) then TSQLConnection(database).UnPrepareStatement(FCursor);
+    end;
   if DefaultFields then
     DestroyFields;
   FIsEOF := False;
@@ -1216,7 +1219,8 @@ begin
   ReadFromFile:=IsReadFromPacket;
   if ReadFromFile then
     begin
-    FCursor:=TSQLCursor.Create;
+    if not assigned(fcursor) then
+      FCursor := TSQLConnection(Database).AllocateCursorHandle;
     FCursor.FStatementType:=stSelect;
     FUpdateable:=True;
     end