Форум: "KOL";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
ВнизЗапись текста из 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 вся ветка
Форум: "KOL";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.043 c