Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.06.2009, 15:20
Serval Serval вне форума
Прохожий
 
Регистрация: 20.01.2009
Сообщения: 18
Репутация: 30
Печаль Проблемы с записью данных в базу

База MSSQL Server 2000 или 2005
запросы пишу на ADO

нужно записать данные типа в поле с типом данных varbinary
Код:
  TPkt = array[0..100] of Byte;
в поле с типом данных varbinary (255)

делаю запрос
Код:
  with ADOSend do
    try
       if not Active then
        close;
          Open;
        Insert;
        FieldByName('ComputerName').AsString := MyGetComputerName;
        FieldByName('Packet').SetData(@pkt); //вот в этой строке проблема
        Post;
    except
    end;

выдает ошибку Access violation
подскажите где я тупанул - или подскажите как этот массив байтовый туда запихать.
Ответить с цитированием
  #2  
Старый 25.06.2009, 04:36
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Проблема видимо в том, что поле переменной длины. Попробуй записать данные через поток, как для BLOB поля.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 02.07.2010, 12:09
blackswan blackswan вне форума
Прохожий
 
Регистрация: 27.05.2010
Сообщения: 4
Репутация: 10
По умолчанию

если возникли трудности с TBlobField, то вот вариант корявый прямо через строку, медленный, но работает, данные могут сохранится не в том виде как хотелось, но если цель - только сохранить их , то вот
Код:
  StringBuilder: TStringBuilder;
  I : LongInt;
  arr : array of Byte;
sqlstring: string;

    StringBuilder.Append('DECLARE @Data varbinary(8000)').AppendLine;
    StringBuilder.Append('SET @Data = 0x');
    for I := 0 to Length(arr)-1 do
        StringBuilder.AppendFormat('%d',[arr[i]]);
      StringBuilder.AppendLine;
sqlstring := StringBuilder.ToString;
теперь с @Data можно работать и передавать куда угодно, можно и без @Data

у меня другая проблема, мне нужно не записать, а прочитать данные
запрос у меня возвращает TRecordset, в котором есть поле Res Varbinary(8000), подскажите, как получить блоб и загрузить его в MemoryStream. Нашел один кусочек примера,

Код:
BLOB:=TBlobStream.Create((query1.FieldByName('COLUMN1')) as TBlobField,bmRead);

изменил под себя, но на эту строку ругается

Код:
 Blob := TBlobStream.Create(( R.FieldByName('Res')) as TBlobField,bmRead);

E2015 Operator not applicable to this operand type
( R : TRecordset; Blob : TBlobStream
Видимо с TRecordset такое не работает, а только с TAdoQuery, но я не могу получить никакие объекты ADO , кроме TRecordset, из-за специфики библиотеки, которой пользуюсь, есть варианты как это обойти?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter