![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при вызове CreateBlobStream [D7, XP]
prodex © (2011-04-17 20:35:00)Здравствуйте уважаемые Мастера. Проблема в следующем:
БД IB:
CREATE DOMAIN "NUM_TYPE" AS INTEGER;
CREATE DOMAIN "PACK_TYPE" AS BLOB SUB_TYPE 0 SEGMENT SIZE 80;
CREATE DOMAIN "WORD_TYPE" AS CHAR(2) CHARACTER SET WIN1251;
CREATE TABLE "TMP_PACK"
(
"NUM" "NUM_TYPE",
"MARK" "WORD_TYPE",
"PACK" "PACK_TYPE"
);
при записи BLOB-поля:
var
s : TStream;
DataBuf : TMemoryStream;
begin
IBTable1.Edit;
s:=IBTable1.CreateBlobStream(IBTable1.FieldByName('PACK'),bmWrite);
DataBuf.Position:=0;
s.CopyFrom(DataBuf,DataBuf.Size);
IBTable1.Post;
IBTable1.Transaction.Commit;
IBTable1.Open;
end;
после вызова CreateBlobStream выдает ошибку:
Access violation at address 004906C0 in module 'Project1.exe'. Read of address 04660000.
В чем может быть причина ошибки?
sniknik (2011-04-18 08:08:00) [1]писать бинарные данные в текстовый блоб может быть проблемно... в mssql например оно по разному отрабатывает и обрезает в каких то случаях все после символа #0.
бинарный блоб тоже должен работать (у меня же работает). ну не знаю, посмотри диалект с который база создана, может у тебя с 1, а нужно 3.
prodex (2011-04-18 07:05:00) [2]sniknik © [28] - не помогло.
Проблема решилась таким образом:
в объявлении полей вместо
CREATE DOMAIN "PACK_TYPE" AS BLOB SUB_TYPE 0 SEGMENT SIZE 80;
сделал:
CREATE DOMAIN "PACK_TYPE" AS BLOB SUB_TYPE TEXT SEGMENT SIZE 80;
и все пошло.
Всем спасибо за помощь и терпение.
sniknik (2011-04-18 00:06:00) [3]> привожу весь код:
код рабочий... более менее
мне пришлось сделать небольшие изменения, имена полей (какие были. несущественно), и добавить изменения ключа (кстати!!!, обновлять запись по блобу ни один сервер не может, а без ключевого поля как у тебя, у него нет вариантов... впрочем говоришь у тебя до этого не доходит)
ненужное закоментарил
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i: byte;
begin
DataBuf:= TMemoryStream.Create;
for i:= 1 to 241 do
DataBuf.Write(i, 1);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
IBTable1.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DataBuf.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
//var
// s: TStream;
begin
DataBuf.Position:= 0;
IBTable1.Edit;
IBTable1.FieldByName('ID').AsInteger:= 1;
IBTable1.CreateBlobStream(IBTable1.FieldByName('IMG'), bmWrite).CopyFrom(DataBuf, DataBuf.Size);
//s.CopyFrom(DataBuf, DataBuf.Size);
IBTable1.Post;
//IBTable1.Transaction.Commit;
//IBTable1.Open;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IBTable1.Edit;
IBTable1.FieldByName('ID' ).AsInteger:= 2000;
IBTable1.FieldByName('IMG').Clear;
IBTable1.Post;
//IBTable1.Transaction.Commit;
//IBTable1.Open;
end;
end.
Игорь Шевченко (2011-04-17 23:57:00) [4]
> Trivial
vulgaris
prodex (2011-04-17 23:02:00) [5]Кстати, есть ли способы сохранения данных из TMemoryStream в БД IB кроме BLOB поля? Содержимое TMemoryStream - случайный набор байт. Да может ну его, этот BLOB?
prodex (2011-04-17 22:43:00) [6]Уважаемый sniknik ©, привожу весь код:
procedure TForm1.FormCreate(Sender: TObject);
var
i : byte;
begin
DataBuf:=TMemoryStream.Create;
for i:=1 to 241 do DataBuf.Write(i,1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s : TStream;
begin
s:=IBTable1.CreateBlobStream(IBTable1.FieldByName('PACK'),bmWrite);
IBTable1.Edit;
DataBuf.Position:=0;
s.CopyFrom(DataBuf,DataBuf.Size);
IBTable1.Post;
IBTable1.Transaction.Commit;
IBTable1.Open;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IBTable1.Edit;
IBTable1.FieldByName('Num').AsInteger:=2000;
IBTable1.Post;
IBTable1.Transaction.Commit;
IBTable1.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DataBuf.Destroy;
end;
насчет "дебилов", это Вы зря, я такого не говорил.
sniknik (2011-04-17 22:17:00) [7]> Иначе будет что-то типа "Not in Edit mode".
ну, это только на реальном, а не "сфантазированном для того чтобы показать, и не было вопросов что это".
мне можешь ничего не объяснять, мне пофигу на слова. а код в нормальном виде ты приводить не захотел, наоборот убрал то что посчитал не нужным (не показал, развеяв сомнения, а убрал...).
> Commit - запись в БД, после этого IBTable1.Active - false, данные не отображаются
ну вот опять... чудеса, транзакция закрывает рекордсет... кто работал с IB компонентами (я давно и только "краем" потестил) их разработчики действительно дебилы, как говорит автор темы?
prodex (2011-04-17 22:13:00) [8]Может быть надо сконфигурировать IBTable, IBTransaction, IBDatabase как-нибудь? Все 3 компонента были просто брошены на форму, заполнены поля, необходимые для отображения содержимого БД в DBGrid, и все. Больше ни у кого идей нет?
prodex (2011-04-17 21:57:00) [9]
> например то что сначала делается едит, потом работа на запись
> в блоб
на сколько я понимаю, перед записью надо открыть IBTable1 для записи. Иначе будет что-то типа "Not in Edit mode".
> и самым последним открытие таблицы
Commit - запись в БД, после этого IBTable1.Active - false, данные не отображаются, поэтому Open.
Anatoly Podgoretsky (2011-04-17 21:52:00) [10]
> sniknik © (17.04.11 21:46) [19]
Homo Partizanus Trivial
Anatoly Podgoretsky (2011-04-17 21:50:00) [11]> prodex (17.04.2011 21:39:18) [18]
После вызова CreateBlobStream выдает выполняется как раз
DataBuf.Position:=0;
Если же при вызове, то возможно нет поля 'PACK'
sniknik (2011-04-17 21:46:00) [12]> Предлагаешь тебе на слово верить.
я бы не стал...
там вообще много странного в коде, таком маленьком...
например то что сначала делается едит, потом работа на запись в блоб, потом пост, и самым последним открытие таблицы... (то что таблица уже молчу).
ну разве не странно? но наверняка это для того чтобы что то показать, что делается до этого, а тут просто шоу для нас...
prodex (2011-04-17 21:39:00) [13]В моем посте четко сказано:
> после вызова CreateBlobStream выдает ошибку:
> Access violation at address 004906C0 in module 'Project1.
> exe'. Read of address 04660000.
Anatoly Podgoretsky (2011-04-17 21:37:00) [14]
> и чтоб не возникало вопросов: "А что за Databuf?". Но похоже
> получилось наоборот. По поводу Databuf: экземпляр класса
> успешно создан, работает, в программе я им пользуюсь, сбоев
> нет. Т.е. с DataBuf все нормально. Ошибка в процедуре возникает
> до использования DataBuf, так что DataBuf не причем. Это
> точно.
Предлагаешь тебе на слово верить.
И также догадываться в какой строке возникает ошибка.
prodex (2011-04-17 21:36:00) [15]есть точно, потому как было такое, что прошляпил название поля и была сгенерирована ошибка, что поле с именем "не PACK" не существует
Юрий Зотов (2011-04-17 21:32:00) [16]Значит, остается предположить, что поля с именем PACK - нет.
prodex (2011-04-17 21:29:00) [17]
> Здесь написал его для того, чтоб Вы видели что это TMemoryStream
и чтоб не возникало вопросов: "А что за Databuf?". Но похоже получилось наоборот. По поводу Databuf: экземпляр класса успешно создан, работает, в программе я им пользуюсь, сбоев нет. Т.е. с DataBuf все нормально. Ошибка в процедуре возникает до использования DataBuf, так что DataBuf не причем. Это точно.
Anatoly Podgoretsky (2011-04-17 21:24:00) [18]
> я его здесь описал для его идентификации, как класса.
Зачем ты это сделал?
prodex (2011-04-17 21:24:00) [19]
> строки перепутаны местами
Эта:
s:=IBTable1.CreateBlobStream(IBTable1.FieldByName('PACK'),bmWrite);
и эта:
IBTable1.Edit;?
Если так, то пробовал, точно не работает.
А вот:
> нету экземпляра поля pack.
, это интересно, пожалуйста, можно поподробней?
Anatoly Podgoretsky (2011-04-17 21:22:00) [20]
> Пушкин вряд ли бы его создал, он из гуманитариев.
А разница, да никакой.