Save ROComplexType to database

Hi,

How to load/save data from ROComplexType to database ? Any sample ?

I just need the data in binary form …

Plataform: Delphi.

Thanks,
Willian.

Hello,
You wrote:

How to load/save data from ROComplexType to database ? Any sample ?
I just need the data in binary form …

You can use TROStreamSerializer. It serializes data in binary format.

MyType = class(TROComplexType) //create this type using ServiceBuilder
...................
var
  t1,t2:MyType;
  aSerializer:TROStreamSerializer;
  aSaveStream, aLoadStream:TMemoryStream;
begin
  aSerializer := TROStreamSerializer.Create(nil);
  aSaveStream:=TMemoryStream.Create;
  aLoadStream:=TMemoryStream.Create;

  t1 := MyType.Create;
  t1.FieldInteger := 127;
  try
    //Save Type to a field
    aSerializer.SetStorageRef(aSaveStream);
    aSerializer.Write('AValue', TypeInfo(MyType), t1);
    MemDataTable.Edit();
    //..........................................................
    MemDataTable.FieldByName('MyType').LoadFromStream(aSaveStream);//Save to field
    MemDataTable.Post();

    //Load type from a field
    MemDataTable.FieldByName('MyType').SaveToStream(aLoadStream);//Save to field
    aLoadStream.Position := 0;
    aSerializer.SetStorageRef(aLoadStream);
    t2 := nil;
    aSerializer.Read('AValue', TypeInfo(MyType), t2);
    //if (t2.FieldInteger=127) then;

  finally
    t1.Free();
    aSerializer.Free();
  end;
end;

RO raised exception class ERangeError with message ‘Range check error’. when unpack stream data from database,my code :smile:

function TSQLiteMemoryCache.Get(const anEntryName: string): INHCacheEntry;
var
  entry : TNHCacheEntry;
  ADataStream: TStream;
  ASerializer: TROStreamSerializer;
  Data: TROArray;
  SQLiteStatement: TDISQLite3Statement;
begin
  fCritical.Enter;
  try
    Result := nil;
    try
      SQLiteStatement := fSQLiteMemory.Prepare(Format('SELECT Data FROM cache_entry WHERE Name = ''%s'';', [anEntryName]));
      try
        if SQLiteStatement.Step = SQLITE_ROW then
        begin
          ADataStream := TMemoryStream.Create;
          ADataStream.Write(SQLiteStatement.Column_Blob(0)^, SQLiteStatement.Column_Bytes(0));
          ASerializer := TROStreamSerializer.Create(nil);
          ASerializer.SetStorageRef(ADataStream);
          ADataStream.Position := 0;
          Data := nil;
          aSerializer.Read(Data.ClassName, Data.ClassInfo, Data);
          Result := TNHCacheEntry.Create(anEntryName, Data);
          ASerializer.Free;
          ADataStream.Free;
          //更新读取缓存次数
          fSQLiteMemory.Execute(Format('UPDATE cache_entry SET ReadCount = ReadCount + 1 WHERE Name = ''%s'';', [UpperCase(anEntryName)]));
        end;
      finally
        SQLiteStatement.Free;
      end;
    except
      on E: Exception do
      begin
        raise Exception.Create(Format('Get Cache Error: %s', [E.Message]));
      end;
    end;
  finally
    fCritical.Leave;
  end;
end;

it throw exception when execute the line code

aSerializer.Read(Data.ClassName, Data.ClassInfo, Data);

Can you please create a small testcase that will reproduce this problem? You can send it to support@remobjects.com.