![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| BigMazy |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.2.2003 Репутация: нет Всего: нет |
Здравствуйте,
Мне очень необходио сделать следующую вешь: Создать поле в БД, которое хранило бы сложную структуру типа RECORD. Как я понял, необходимо работать с потоками, типа BlobStream, но что-то не получается. Заранее благодарен, Александр. |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
Типичная ошибка в 18-й строчке программы.
-------------------- |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
Александр, если Вы хотите получить полноценный и четкий ответ, то напишите в чем непосредственно заключается у Вас ошибка, и запостите кусочек кода, где "затыкается" компилятор.
Мы же в конце концов не экстрасенсы, чтобы видеть, где же именно у Вас "что-то не получается." -------------------- |
|||
|
||||
| BigMazy |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.2.2003 Репутация: нет Всего: нет |
Здравствуйте,
Вот, что я написал для работы с BLOB - полем: База Данных на Paradox, Название поля "Record",а его тип Binary Дело в том, что какая-то информация заноситься без ошибок компиляции, но при попытки ее считать возникают ошибки: "Blob has been modifided" и иногда "Record locked by another user" type // описание структуры, которая будет заноситься в BLOB TRec=record a: integer; b: string; end; var BS,BS2: TStream; buf,buf2: Trec; begin buf.b:='This is a BLOB'; buf.a:=1000; // Записываю в БД структуру Table1.First; Table1.Edit; BS:=Table1.CreateBlobStream(Table1.FieldByName('Record'),bmWrite); BS.WriteBuffer(buf,Sizeof(Buf)); Table1.Post; // Хочу получить данные из BLOB-поля Table1.First; Table1.Edit; BS2:=Table1.CreateBlobStream(Table1.FieldByName('Record'),bmReadWrite); BS2.ReadBuffer(Buf2,SizeOf(Buf)); Table1.post; end; |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
"Blob has been modifided" - обычно свидетельствует о повреждении таблицы, обычно возникает при не аккуратной работе в многопользовательском режиме. Откройте парадокс и исправте таблицу. Впредь следите за нормальным завершением программы с закрытием таблиц и сбросом буфферов.
"Record locked by another user" 1) BDEAdministrator->Tab:Configuration->Drivers->Native->Paradox->Net Dir Параметер должен показывать на один и тот же диск на всех машинах, использующих данную базу данных. 2) Не прерывайте программу по Ctrl-F2, Ctrl-Alt-Del. проследите чтобы при любом раскладе при выходе из программы все таблицы закрывались, все открытия на запись типа Edit/Append/Insert заканчивались либо Post либо Cancel. 3) Удалите все файлы *.lck -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| BigMazy |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.2.2003 Репутация: нет Всего: нет |
Большое Спасибо, Vit
Работает. Только вот вопрос- я заношу в Blob -поле некоторый текст, а когда достаю из базы данных этот текст - он выглядит, как набор различных символов. Если не сложно, подскажите как получить мне преждний текст ? |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Похоже на то что вместо контекста идёт попытка запомнить указатель и в базу заноситься всякий мусор вместо реальных данных. Проверьте внимательно чтО именно вы пишете в базу. Используйте в записях короткие строки, так как обычные длинные строки могут себя вести как указатели...
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| BigMazy |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.2.2003 Репутация: нет Всего: нет |
Спасибо большое, Vit !!!
Работает, действительно, проблема была в том, что я использовал тип String, а не ShortString(если исользовать этот тип, то все работает. |
|||
|
||||
| Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Если всё же надо использовать длинные строки то вот как это можно сделать:
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
| Unregistered |
|
|||
|
Unregistered |
Здравствуйте, вот опять неполадки с BLOB-полями
Ниже часть кода, который должен вставить в BLOB-поле с именем "b" массив байт signature2, а затем, создав новый поток, извлечь информацию из этого поля в переменную signature3, НО в когда я пытаюсь получить значение из БД-выдается ошибка:" BLOB not opened" Подскажите, из-за чего ошибка Заранее благодарен, BigMazy var BS1,BS2: TStream; signature2,signature3: array[0..63] of byte; begin // - в Table2 - будет только 1 запись Table2.Insert; BS1:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmReadWrite); BS1.Write(signature2,64); Table2.FieldByName('number').asInteger:=1; Table2.Post; Table2.Refresh; BS1.Destroy; Table2.First; Table2.Edit; BS2:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmread); BS2.read(signature3,64); Table2.Post; BS2.Destroy; end; |
|||
|
||||
| BigMazy |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.2.2003 Репутация: нет Всего: нет |
Фу, забыл авторизироваться !
Здравствуйте, вот опять неполадки с BLOB-полями Ниже часть кода, который должен вставить в BLOB-поле с именем "b" массив байт signature2, а затем, создав новый поток, извлечь информацию из этого поля в переменную signature 3, НО в когда я пытаюсь получить значение из БД-выдается ошибка:" BLOB not opened" Подскажите, из-за чего ошибка Заранее благодарен, BigMazy var BS1,BS2: TStream; signature2,signature3: array[0..63] of byte; begin // - в Table2 - будет только 1 запись Table2.Insert; BS1:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmReadWrite); BS1.Write(signature2,64); Table2.FieldByName('number').asInteger:=1; Table2.Post; Table2.Refresh; BS1.Destroy; Table2.First; Table2.Edit; BS2:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmread); BS2.read(signature3,64); Table2.Post; BS2.Destroy; end; |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
1) Edit/post не нужны при чтении значения
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| BigMazy |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.2.2003 Репутация: нет Всего: нет |
Я попытался, убрать POST и EDIT
Но ошибка осталась. Я уже переписывал БД, но не помогло; Дело в том, что не работает в том случае, если я в одном и том же сеансе работы программы буду выполнять и вствку BLOB-поля и и его чтение из этой же таблицы. В случае я запущу программу занесу информацию в BLOB-поле, затем перезапущу программу и считаю его, то все будет работать. Table2.Insert; BS1:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmReadWrite); BS1.Write(signature2,64); Table2.FieldByName('number').asInteger:=1; Table2.Post; Table2.Refresh; BS1.Destroy; Table2.First; BS2:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmread); BS2.read(signature3,64); BS2.Destroy; end; |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Попробуй вставить:
BS2:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmread); BS2.Seek(0,soFromBeginning); BS2.read(signature3,64); Вообще-то непонятно в чём проблема, попробуй поставить вместо буффера короткую строку и посмотри - вообще что-то пишеться в базу и может ли прочитаться -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| BigMazy |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.2.2003 Репутация: нет Всего: нет |
Здравствуйте,
поставил BS2:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmread); BS2.Seek(0,soFromBeginning); BS2.read(signature3,64); но ошибка осталась. В BLOB поле заноситься значение ShortString, и читается тоже. Я сегодня обнаружил, что если после записи закрыть таблицу, а затем снова открыть, то все работает: Может быть после вставки информации в BLOB таблица каким-то образом блокируется ? Table2.Insert; Table2.FieldByName('number').asInteger:=1; BS1:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmReadWrite); BS1.Write(Signature2,64); Table2.Post; Table2.Refresh; BS1.Destroy; Table2.Active:=false; Table2.Active:=true; Table1.First; BS2:=Table2.CreateBlobStream(Table2.FieldByName('b'),bmread); BS2.read(Signature3,64); BS2.Destroy; end; |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |