Добрых суток,
Собственно сам сабж. (я не программист, я системный администратор)
Имеется класс
MasOfObjectsOfInventory = record
ID:integer;
ObjectName: string;
end;
Имеем динамический массив
var
masObjectsOfInventoryOnStart:array of MasOfObjectsOfInventory ;
...
тут действия с массивом, установка его размера и занесение в него данных
...
Пытаюсь записать в BLOB
insertDataInTableofBLOBField(masObjectsOfInventoryOnStart);
function insertDataInTableofBLOBField(masObjectsOfInventoryOnStart:MasOfObjectsOfInventory):BOOLEAN;
var
per_IBQuery:TIBQuery;
Stm: TMemoryStream;
Len1, Len2: LongInt;
Str1, Str2: WideString;
begin
// процедура для записи введеных данных
per_IBQuery:=my_initialization_TIBQuery_insert(per_IBQuery); //инициализируем переменную TIBQuery и передаем ей параметры подключения
per_IBQuery.Active := False;
per_IBQuery.SQL.Clear;
per_IBQuery.SQL.Add('insert into HISTORY_INVENTORY '
+ '(ID_INVENTORY, ' { ид Представителя в дереве }
+ ' HISTORY '
+ ')'
+ ' values ( '
+ ':perID_INVENTORY, '
+ ':perHISTORY '
+ ')');
Stm := TMemoryStream.Create;
try
Stm.Write(masObjectsOfInventoryOnStart, sizeof(masObjectsOfInventoryOnStart));
Stm.Position := 0;
per_IBQuery.ParamByName('perHISTORY').LoadFromStream( Stm, ftBlob);
finally
FreeAndNil(Stm)
end;
if perID_INVENTORY=0 then per_IBQuery.ParamByName('perID_INVENTORY').IsNull else per_IBQuery.ParamByName('perID_INVENTORY').AsInteger:=perID_INVENTORY;
per_IBQuery.ExecSQL;
fmConnectToBase.IBTransaction2.Commit;
FreeAndNil(per_IBQuery); //Эквивалентно: People. Free; People := nil;
Вроде записывает все ок тут
Но вот как считать правильно?
Пытаюсь так
function GetDataFromBLOB(perID:integer):MasOfObjectsOfInventory;
var
per_IBQuery:TIBQuery;
stm: TStream;
Len, Len2: LongInt;
Str, Str2: WideString;
perParameterHistoryInventory:type_InventoryHistory;
begin
per_IBQuery:=my_initialization_TIBQuery_insert(per_IBQuery); //инициализируем переменную и передаем ей параметры
per_IBQuery.Active:=false;
per_IBQuery.SQL.Clear;
per_IBQuery.SQL.Add('select * from HISTORY_INVENTORY WHERE ID = :perID');
if perID=0 then per_IBQuery.ParamByName('perID').IsNull else per_IBQuery.ParamByName('perID').AsInteger:=perID;
per_IBQuery.Active:=true;
per_IBQuery.Last;
stm := per_IBQuery.CreateBlobStream( per_IBQuery.FieldByName('HISTORY'), bmRead);
try
Stm.Position:=0;
Stm.Read(masObjectsOfInventoryOnStart, sizeof(masObjectsOfInventoryOnStart));
result:=masObjectsOfInventoryOnStart;
finally
FreeAndNil(Stm);
end;
end;
И получаю ошибку вида:
---------------------------
Debugger Exception Notification
---------------------------
Project alladmin.exe raised exception class EAccessViolation with message 'Access violation at address 00405864 in module 'alladmin.exe'. Read of address 01DBE13C'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Я так понимаю надо задать размер массива , а как это сделать? это ж надо как то вычислить размер , я не совсем догоняю