Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1303147684
TStas
2011-04-18 21:28
2011.07.24
Ошибка при чтении компонента из потока


15-1302211804
Юрий
2011-04-08 01:30
2011.07.24
С днем рождения ! 8 апреля 2011 пятница


2-1303058118
prodex
2011-04-17 20:35
2011.07.24
Ошибка при вызове CreateBlobStream


15-1302033916
Кто б сомневался
2011-04-06 00:05
2011.07.24
Post метод и комбобокс (js?)


2-1303294957
jacksotnik
2011-04-20 14:22
2011.07.24
помогите с задачкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский