Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.18;
Скачать: CL | DM;

Вниз

Запись текста из memo в blob поле   Найти похожие ветки 

 
Cawa ©   (2006-06-17 15:50) [0]

Помогите пожалуйста, неудается записать данные в 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.

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


 
ECM ©   (2006-06-17 18:25) [1]

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


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

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

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


 
ECM ©   (2006-06-18 10:58) [3]

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


 
Cawa ©   (2006-06-18 11:40) [4]

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


 
Cawa ©   (2006-06-18 11:42) [5]

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


 
ECM ©   (2006-06-18 12:28) [6]

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

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


 
ECM ©   (2006-06-20 18:52) [7]

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


 
Cawa ©   (2006-06-23 10:08) [8]

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


 
Cawa ©   (2006-06-23 15:20) [9]

Хотя я рано обрадовался при чтении, 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;


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

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

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

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

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


 
ECM ©   (2006-06-23 16:02) [11]

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
...


 
Cawa ©   (2006-06-23 16:28) [12]

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


 
ECM ©   (2006-06-23 18:51) [13]

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

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


 
Cawa ©   (2006-06-24 10:03) [14]

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


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


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

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

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


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

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


 
Cawa ©   (2006-06-24 10:43) [16]

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


 
ECM ©   (2006-06-24 11:41) [17]

Я думаю, что ответить здесь будет правильнее :)
Таблица из [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;


 
ECM ©   (2006-06-24 11:53) [18]

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

Stream.Free
:)


 
Cawa ©   (2006-06-24 12:18) [19]

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



Страницы: 1 вся ветка

Текущий архив: 2007.03.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.035 c
2-1172653323
Sinus
2007-02-28 12:02
2007.03.18
Загрузить данные из ТХТ в FireBird


3-1166370695
Jeeb
2006-12-17 18:51
2007.03.18
Проблема округления в DBGrid


8-1152996420
@!!ex
2006-07-16 00:47
2007.03.18
Упаковка звука.


15-1171669892
SerJaNT
2007-02-17 02:51
2007.03.18
Mandriva Linux 2007 PowerPack на русском языке


4-1162818043
Виктор1985
2006-11-06 16:00
2007.03.18
Функция обратная GetDC