Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись текста из memo в blob поле


Cawa ©   (2006-06-17 15:50:00) 

Помогите пожалуйста, неудается записать данные в blob поле!!!
Пытаюсь записать следующим образом:

 Stream:=NewMemoryStream;
 for i:=0 to Memo1.Count-1 do
   Stream.WriteStr(memo1.Items[i]);
 UserQuery.text:='update Users set "REPSW" = ?DATA where "ID" = ?ID';
 UserQuery.ParamByName['id'].AsInteger:=id;
 UserQuery.ParamByName['Data'].AsQUAD:=UserQuery.Stream2Blob(Stream);
 if UserTransact.Active then UserTransact.Commit else UserTransact.StartTransaction;
 if UserQuery.Execute then
 begin
   UserTransact.Commit;
 end;
 Stream.Free;


выдается ошибка incorrect values within SQLDA structure.

Что я делаю не так?


Cawa   (2006-06-24 12:18:00) [1]

Так как у меня не было перехода на начало потока Stream.Seek(0,spBegin); ,то ничего и не записывалось (Я наивно думал что IBQuery1.Stream2Blob(Stream) запишет поток от начало до конца).
Теперь все работат, спасибо еще раз!!!


ECM   (2006-06-24 11:53:00) [2]

З.Ы.
Естесственно в конце каждого из кусков надо вызвать

Stream.Free
:)


ECM   (2006-06-24 11:41:00) [3]

Я думаю, что ответить здесь будет правильнее :)
Таблица из [13].
Запись:

var
 Stream: PStream;
begin
 Stream := NewMemoryStream();
 Stream.WriteStrZ(Memo1.Text);
 Stream.Seek(0,spBegin);
 IBQuery1.Text := 'update TESTTABLE set REPSW = ?DATA where ID = ?ID';
 IBTransaction1.StartTransaction;
 IBQuery1.ParamByName['DATA'].AsQUAD := IBQuery1.Stream2Blob(Stream);
 IBQuery1.ParamByName['ID'].AsInteger := 1;
 if IBQuery1.Execute then  IBTransaction1.Commit
 else IBTransaction1.Rollback;


Чтение:
var
 Stream: PStream;
begin
 Stream := NewMemoryStream();
 IBQuery1.Text := 'select * from TESTTABLE where ID = ?ID';
 IBQuery1.ParamByName['ID'].AsInteger := 1;
 IBTransaction1.StartTransaction;
 IBQuery1.Open;
 IBQuery1.Blob2Stream(IBQuery1.FieldByName['REPSW'].AsQUAD,Stream);
 IBTransaction1.Commit;
 Stream.Seek(0,spBegin);
 Memo1.Text := Stream.ReadStrZ;


Cawa   (2006-06-24 10:43:00) [4]

2ECM можешь мне скинуть на почту небольшой пимер запись в blob поле данных и их чтение? Может тогда я пойму, что у меня не так!


AndreyRus   (2006-06-24 10:29:00) [5]


> IBexpert пишет при подключении к базе (dialect 1) - что
> это значит?

Это один из вариантов (диалектов) SQL.

Может это повлиять на запись в Blob?
Наврядли.


> скачал IBExpert в нем поля отображаются заполнеными (листки
> с точечками), но данных в них нет.

Возможно, проблемы с кодировкой текста.


Cawa   (2006-06-24 10:03:00) [6]

Так как я слабо знаю InterBase, то возможно я сейчас задам тупые вопросы.
У меня IBexpert пишет при подключении к базе (dialect 1) - что это значит?
Может это повлиять на запись в Blob? Игде можно найти инфу по SQL Dialect?


ECM   (2006-06-23 18:51:00) [7]

> Что тогда я делаю неправильно при записи

Да, вроде, всё правильно...
У меня IBExpert показывает содержание блоба просто при наведении курсора
(хинт-окно вываливается) - и там всё то что я туда писал...:(
Вот на такой таболичке
SET SQL DIALECT 3;
SET NAMES WIN1251;
CREATE TABLE TESTTABLE (
   REPSW  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
   ID     SMALLINT
);


Cawa   (2006-06-23 16:28:00) [8]

прописал  FieldByName['RePSW'].AsString для blob полей выводит различные значения (Blob ID: 0x830000000d и т.п.), скачал IBExpert в нем поля отображаются заполнеными (листки с точечками), но данных в них нет(пусто во всех предложенных вариантов просмотра)!!!
Что тогда я делаю неправильно при записи (ведь значения блобов не null)?


ECM   (2006-06-23 16:02:00) [9]

P.S.
Запись Вы производите, правильно, только я бы записал это так:

...
UserTransact.StartTransaction;
UserQuery.text:='update Users set REPSW = ?DATA where ID = ?ID';
UserQuery.ParamByName['id'].AsInteger:=id;
UserQuery.ParamByName['Data'].AsQUAD:=UserQuery.Stream2Blob(Stream);
if UserQuery.Execute then
...


ECM   (2006-06-23 15:48:00) [10]

> Судя по всему он в blob поле не записал ничего

А проверить каким нибудь сторонним средством?
Например IBExpert...

> либо я как то неправильно читаю от туда

К сожалению из приведенного Вами куска не видно где и как вы выполняете
выборку из базы (select). Т.е. UserQuery.Text при чтении...
Или Вы думаете, что он сам всё за Вас сделает :)
...
Проверьте, какое значение принимает поле RePSW, при чтении.
(Запишите его в тот же memo1, например, при помощи FieldByName['RePSW'].AsString). Должно быть нечто типа (Blob ID: 0x8300000003 )
Если будет (Blob ID: 0x000000000 ) - значит либо Вы не произвели выборку из базы (Execute с селектом), либо туда ничего не записалось при записи (Но это легко проверить тем же IBExpert - у меня он на версии 1.14 показывал что всё нормально и отображает содержимое текстового блоба)


Cawa   (2006-06-23 15:20:00) [11]

Хотя я рано обрадовался при чтении, memo остается пустым .:(
Судя по всему он в blob поле не записал ничего (либо я как то неправильно читаю от туда)!?

запись:
 Stream:=NewMemoryStream;
 for i:=0 to Memo1.Count-1 do
   Stream.WriteStrZ(memo1.Items[i]);
 UserTransact.StartTransaction;
 UserQuery.text:='update Users set "REPSW" = ?DATA where "ID" = ?ID';
 UserQuery.Prepare;
 UserQuery.ParamByName['id'].AsInteger:=id;
 UserQuery.ParamByName['Data'].AsQUAD:=UserQuery.Stream2Blob(Stream);
 if UserQuery.Execute then
 begin
   UserTransact.Commit;
 end;
 Stream.Free;


чтение:
 Stream:=NewMemoryStream;
 memo1.Clear;
 if UserQuery.FieldByname['RePSW']<>nil then
   UserQuery.Blob2Stream(UserQuery.FieldByname['RePSW'].AsQUAD,Stream);
 Stream.Seek(0,spBegin);
 while Stream.Position<Stream.Size do
   memo1.Add(Stream.ReadStrZ+#13+#10);
 Stream.Free;


Cawa   (2006-06-23 10:08:00) [12]

Загрузил версию 1.14, все работает |-)
Огромное тебе спасибо ECM!!!!!!!!!!!!!!!!


ECM   (2006-06-20 18:52:00) [13]

Обновил до 1.14
Исправил ошибку при установке BLOB-параметров


ECM   (2006-06-18 12:28:00) [14]

Перезалил. Но всё равно

> Вышлите мне на мыло (в анкете) структуру таблицы (названия
> полей + типы)


Cawa   (2006-06-18 11:42:00) [15]

winrar3.0- точнее WinRAR 3.30


Cawa   (2006-06-18 11:40:00) [16]

Скачал KolIB.zip, но вот распакавался он не полностью - winrar3.0 кричит архив поврежден!!!


ECM   (2006-06-18 10:58:00) [17]

Да, похоже, я что-то напутал с обновлениями
попробуйте
http://www.kolnmck.ru/files/components/db/kolib.zip
залил последнюю версию - но имхо косяк останется... :(
Вышлите мне на мыло (в анкете) структуру таблицы (названия полей + типы)
Завтра попробую разобраться (если буду в состоянии :) )...  Сегодня - ну ни как :)


Cawa   (2006-06-18 08:37:00) [18]

UserQuery.Prepareне помогает, а весия kolibdb (если верить надписи в kolibdb.pas) 1.10. Версию 1.13 не нашел!!!

Во первых указывайте в вопросе о чем речь. Я только после анализа кода "смог угадать". Что речь идёт о KOL и KOLIB в частности.:)
Тут ты прав, мой касяк. Раньше все время указывал.


ECM   (2006-06-17 18:25:00) [19]

Во первых указывайте в вопросе о чем речь. Я только после анализа кода "смог угадать". Что речь идёт о KOL и KOLIB в частности.:)
На месте модератора я бы уже давно перебросил этот вопрос в конференцию "Базы" (Он то мог и не догадаться).
Попробуйте перед присвоением значени первого параметра (но после присваивания текста запроса) выполнить UserQuery.Prepare.
Мне кажется я устранял этот баг ... Какая версия KOLIB у Вас?
Если 1.13 и эффект после добавки Prepare останется - значит баг. Буду смотреть...:(


Наверх

Титульная страница Поиск, карта сайта Написать письмо