Форум: "Начинающим";
Текущий архив: 2011.07.24;
Скачать: [xml.tar.bz2];
ВнизОшибка при вызове CreateBlobStream Найти похожие ветки
← →
prodex (2011-04-17 20:35) [0]Здравствуйте уважаемые Мастера. Проблема в следующем:
БД 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.
В чем может быть причина ошибки?
← →
Юрий Зотов © (2011-04-17 20:39) [1]Создавать DataBuf должен Пушкин?
← →
prodex (2011-04-17 20:48) [2]Пушкин вряд ли бы его создал, он из гуманитариев. DataBuf создается не в этой процедуре, я его здесь описал для его идентификации, как класса.
← →
Юрий Зотов © (2011-04-17 20:54) [3]
> prodex (17.04.11 20:48) [2]
> DataBuf создается не в этой процедуре
А где и когда он уничтожается? Похоже, что при входе в этот код он уже уничтожен.
← →
Германн © (2011-04-17 20:55) [4]
> DataBuf создается не в этой процедуре, я его здесь описал
> для его идентификации, как класса.
А теперь еще раз, но по-русски.
← →
prodex (2011-04-17 21:02) [5]DataBuf создается и заполняется в FormCreate. Здесь написал его для того, чтоб Вы видели что это TMemoryStream. В реальности в этой процедуре DataBuf нет, он описан в свойствах формы.
← →
sniknik © (2011-04-17 21:03) [6]> А теперь еще раз, но по-русски.
врет. показывает не то что есть, но предлагает верить, что у него все правильно. откуда тогда ошибка... ну опять наверное Билл Гейтц виноват.
← →
sniknik © (2011-04-17 21:06) [7]> DataBuf создается и заполняется в FormCreate. Здесь написал его для того ...
а попробуй написать так, чтобы не нужно было объяснять где, что, откуда и зачем написал... вот так чтобы обсуждать именно НАПИСАННЫЙ здесь, а не ПРЕДПОЛАГАЕМЫЙ у тебя в голове код.
глядиш и ошибки понятнее будут.
← →
prodex (2011-04-17 21:13) [8]Хорошо, вот:
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;
← →
Медвежонок Пятачок © (2011-04-17 21:14) [9]строки перепутаны местами
← →
Медвежонок Пятачок © (2011-04-17 21:15) [10]нету экземпляра поля pack.
← →
Anatoly Podgoretsky © (2011-04-17 21:22) [11]
> Пушкин вряд ли бы его создал, он из гуманитариев.
А разница, да никакой.
← →
prodex (2011-04-17 21:24) [12]
> строки перепутаны местами
Эта:s:=IBTable1.CreateBlobStream(IBTable1.FieldByName("PACK"),bmWrite);
и эта:IBTable1.Edit;
?
Если так, то пробовал, точно не работает.
А вот:
> нету экземпляра поля pack.
, это интересно, пожалуйста, можно поподробней?
← →
Anatoly Podgoretsky © (2011-04-17 21:24) [13]
> я его здесь описал для его идентификации, как класса.
Зачем ты это сделал?
← →
prodex (2011-04-17 21:29) [14]
> Здесь написал его для того, чтоб Вы видели что это TMemoryStream
и чтоб не возникало вопросов: "А что за Databuf?". Но похоже получилось наоборот. По поводу Databuf: экземпляр класса успешно создан, работает, в программе я им пользуюсь, сбоев нет. Т.е. с DataBuf все нормально. Ошибка в процедуре возникает до использования DataBuf, так что DataBuf не причем. Это точно.
← →
Юрий Зотов © (2011-04-17 21:32) [15]Значит, остается предположить, что поля с именем PACK - нет.
← →
prodex (2011-04-17 21:36) [16]есть точно, потому как было такое, что прошляпил название поля и была сгенерирована ошибка, что поле с именем "не PACK" не существует
← →
Anatoly Podgoretsky © (2011-04-17 21:37) [17]
> и чтоб не возникало вопросов: "А что за Databuf?". Но похоже
> получилось наоборот. По поводу Databuf: экземпляр класса
> успешно создан, работает, в программе я им пользуюсь, сбоев
> нет. Т.е. с DataBuf все нормально. Ошибка в процедуре возникает
> до использования DataBuf, так что DataBuf не причем. Это
> точно.
Предлагаешь тебе на слово верить.
И также догадываться в какой строке возникает ошибка.
← →
prodex (2011-04-17 21:39) [18]В моем посте четко сказано:
> после вызова CreateBlobStream выдает ошибку:
> Access violation at address 004906C0 in module "Project1.
> exe". Read of address 04660000.
← →
sniknik © (2011-04-17 21:46) [19]> Предлагаешь тебе на слово верить.
я бы не стал...
там вообще много странного в коде, таком маленьком...
например то что сначала делается едит, потом работа на запись в блоб, потом пост, и самым последним открытие таблицы... (то что таблица уже молчу).
ну разве не странно? но наверняка это для того чтобы что то показать, что делается до этого, а тут просто шоу для нас...
← →
Anatoly Podgoretsky © (2011-04-17 21:50) [20]> prodex (17.04.2011 21:39:18) [18]
После вызова CreateBlobStream выдает выполняется как раз
DataBuf.Position:=0;
Если же при вызове, то возможно нет поля "PACK"
← →
Anatoly Podgoretsky © (2011-04-17 21:52) [21]
> sniknik © (17.04.11 21:46) [19]
Homo Partizanus Trivial
← →
prodex (2011-04-17 21:57) [22]
> например то что сначала делается едит, потом работа на запись
> в блоб
на сколько я понимаю, перед записью надо открыть IBTable1 для записи. Иначе будет что-то типа "Not in Edit mode".
> и самым последним открытие таблицы
Commit - запись в БД, после этого IBTable1.Active - false, данные не отображаются, поэтому Open.
← →
prodex (2011-04-17 22:13) [23]Может быть надо сконфигурировать IBTable, IBTransaction, IBDatabase как-нибудь? Все 3 компонента были просто брошены на форму, заполнены поля, необходимые для отображения содержимого БД в DBGrid, и все. Больше ни у кого идей нет?
← →
sniknik © (2011-04-17 22:17) [24]> Иначе будет что-то типа "Not in Edit mode".
ну, это только на реальном, а не "сфантазированном для того чтобы показать, и не было вопросов что это".
мне можешь ничего не объяснять, мне пофигу на слова. а код в нормальном виде ты приводить не захотел, наоборот убрал то что посчитал не нужным (не показал, развеяв сомнения, а убрал...).
> Commit - запись в БД, после этого IBTable1.Active - false, данные не отображаются
ну вот опять... чудеса, транзакция закрывает рекордсет... кто работал с IB компонентами (я давно и только "краем" потестил) их разработчики действительно дебилы, как говорит автор темы?
← →
prodex (2011-04-17 22:43) [25]Уважаемый 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;
насчет "дебилов", это Вы зря, я такого не говорил.
← →
prodex (2011-04-17 23:02) [26]Кстати, есть ли способы сохранения данных из TMemoryStream в БД IB кроме BLOB поля? Содержимое TMemoryStream - случайный набор байт. Да может ну его, этот BLOB?
← →
Игорь Шевченко © (2011-04-17 23:57) [27]
> Trivial
vulgaris
← →
sniknik © (2011-04-18 00:06) [28]> привожу весь код:
код рабочий... более менее
мне пришлось сделать небольшие изменения, имена полей (какие были. несущественно), и добавить изменения ключа (кстати!!!, обновлять запись по блобу ни один сервер не может, а без ключевого поля как у тебя, у него нет вариантов... впрочем говоришь у тебя до этого не доходит)
ненужное закоментарил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.
← →
prodex (2011-04-18 07:05) [29]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 08:08) [30]писать бинарные данные в текстовый блоб может быть проблемно... в mssql например оно по разному отрабатывает и обрезает в каких то случаях все после символа #0.
бинарный блоб тоже должен работать (у меня же работает). ну не знаю, посмотри диалект с который база создана, может у тебя с 1, а нужно 3.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.07.24;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.003 c