I use C++ XE6 Builder with ODAC 9.5.18.
The following code looks correct but when I delete the query-Object a EAssertion (EAssertion Failed: TOraObject.Free RefCount = 0 (D:\Projects\Delphi\Dac\Common\Source\MemData.pas, Line 8977)) is rised! Why does a delete rise this Assertion!?
Is there something wrong in my code?
Code: Select all
TOraSession* session = new TOraSession (0);
session->Server = "mapsrv11";
session->Username = "hkf14t";
session->Password = "hkf14t";
session->Connected = true;
TOraQuery* query = new TOraQuery (0);
query->Session = session;
query->SQL->Clear ();
query->SQL->Add ((String)
"select * from geof3044 A where " +
"mdsys.sdo_relate(A.SHAPE, :CUTPOLY," +
"'mask=ANYINTERACT querytype=WINDOW') = 'TRUE' or A.geofid = 4796");
query->Params->Clear();
query->Params->CreateParam (Db::ftObject, "CUTPOLY", Db::ptInput);
TOraObject* oraObject = new TOraObject (0);
oraObject->AllocObject (session->OCISvcCtx, "MDSYS.SDO_GEOMETRY");
// Create Dummy Object
//
oraObject->AttrAsInteger["SDO_GTYPE"] = 2003;
oraObject->AttrAsObject["SDO_POINT"]->IsNull = true;
TOraArray* elemInfo = oraObject->AttrAsArray["SDO_ELEM_INFO"];
elemInfo->ItemAsInteger[0] = 1;
elemInfo->ItemAsInteger[1] = 1003;
elemInfo->ItemAsInteger[2] = 1;
TOraArray* ordinates = oraObject->AttrAsArray["SDO_ORDINATES"];
ordinates->ItemAsFloat[0] = 1;
ordinates->ItemAsFloat[0] = 1;
ordinates->ItemAsFloat[1] = 1;
ordinates->ItemAsFloat[1] = 2;
ordinates->ItemAsFloat[2] = 2;
ordinates->ItemAsFloat[2] = 2;
ordinates->ItemAsFloat[3] = 2;
ordinates->ItemAsFloat[3] = 1;
query->ParamByName ("CUTPOLY")->AsObject = oraObject;
query->Execute ();
oraObject->FreeObject (true);
delete oraObject;
delete query; // EAssertion Failed: TOraObject.Free RefCount = 0 (D:\Projects\Delphi\Dac\Common\Source\MemData.pas, Line 8977)
delete session;
Kind regards
Mike