Hi,
How to load/save data from ROComplexType to database ? Any sample ?
I just need the data in binary form …
Plataform: Delphi.
Thanks,
Willian.
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
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.