Конференция "Базы" » Ошибка при записи в blob TClientDataSet
 
  • Genazvalle (17.08.15 15:30) [0]

    procedure TObjBase.SetSelectedColor(ColorName: string);
    var
     vBlob: TStream;
    begin

     if UniFindRecord('ClientDataSet1', 'Name', 'Colors') then
       if UniFindRecord('DataSet1Properties', 'PropertyName', 'SelectedColor') then
       begin
         //DataSet1Properties.Edit;
         //DataSet1Properties.FieldByName('PropertyValue').value := ColorName;
         //DataSet1Properties.Post;
       end
       else
         InsertRecordDataSet1Properties('SelectedColor', 'ColorList', '',
           'True', 'False');

     DataSet1Properties.Edit;
     vBlob := DataSet1Properties.CreateBlobStream
       (DataSet1Properties.FieldByName('AnyValue'), bmWrite);
     try
       vBlob.Seek(0, soFromBeginning);
       vBlob.WriteBuffer(ColorName, SizeOf(ColorName));
     finally
       vBlob.free;
     end;

     DataSet1Properties.Post;
    end;



    есть вот такой код. Если закоментировать кусок про запись в блоб, и раскомментировать закоментированный кусок, то все работает замечательно. А если вызывать эту процедуру как она написана, то через некоторое количество вызовов (или если ее вызовы спамить, то очень быстро) выскакивает ошибка дальше по коду. Чаще всего Invalid Pointer, или что нибудь типа out of memory или вообще какой нибудь невообразимый кошмар. Из чего я сделал вывод, что запись в блоб неким образом затирает данные программы в памяти. А вот чего я не понял, так это как это победить.

    З.Ы. Строку надо писать в блоб потому что в поле она не влазит, а программу скачали уже 400 раз и переделывать поле мне совсем не хочется.
  • Genazvalle (17.08.15 15:37) [1]
    вопрос снимается

    vBlob.WriteBuffer(ColorName, Length(ColorName) * sizeOf(ColorName[1]));



    нужно писать так )
  • Genazvalle (17.08.15 15:41) [2]
    не это я поторопился, так тоже самое ( аксес виолейшены и прочее прочее
  • Genazvalle (17.08.15 16:10) [3]
    в общем теперь глюк при чтении. Срисовал все со своего же кода который работает. Но почему то он в данном случае не работает.

    vBlob := DataSet1Properties.CreateBlobStream
       (DataSet1Properties.FieldByName('AnyValue'), bmRead);

     SetLength(result, vBlob.Size div sizeOf(char));

     try
       vBlob.Seek(0, soFromBeginning); // sереход в начало потока BLOB
       vBlob.ReadBuffer(result[1], vBlob.Size);
       //result := true;
     finally
       vBlob.free;
     end;



    если читаю так, а пишу как выше, то при чтении в result записывается какая то белеберда. Если
    vBlob.ReadBuffer(result, vBlob.Size);

    читать так, то записывается в резалт правильное слово. только вот дальше программа вылетает с аксес виалейшн, что видимо связано с тем, что в string строка начинается со второй позиции. Но что не так то в таком случае в первом варианте?
  • Genazvalle (17.08.15 16:15) [4]
    списал у самого себя более внимательно, [1] нужно писать так

    vBlob.WriteBuffer(ColorName[1], Length(ColorName) * sizeOf(ColorName[1]));



    приятно иногда поговорить с умным человеком
  • RWolf © (17.08.15 16:28) [5]
    Учитывай, что индексация пустой строки выдаст AV.
 
Конференция "Базы" » Ошибка при записи в blob TClientDataSet
Есть новые Нет новых   [118241   +25][b:0][p:0.001]