C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Переполнение, пересылка в базу
Лена
Отправлено: 21.11.2006, 18:47


Мастер участка

Группа: Участник
Сообщений: 501



Иногда при пересылки картинки в базу выскакивает исключение. Кто знает, как это побороть?

Присоединить изображение

Присоединить изображение

olegenty
Отправлено: 22.11.2006, 08:21


Ветеран

Группа: Модератор
Сообщений: 2412



приведи код запроса на вставку, код посыла с клиента, СУБД, версию, ОС...
Лена
Отправлено: 22.11.2006, 10:30


Мастер участка

Группа: Участник
Сообщений: 501



База postgresql. Windows XP SP2 Media Edition.
Отправка:
CODE

 try{

     TWaitCursor cursor(crSQLWait);
     AnsiString  fileName = PathFolder;
     auto_ptr<TMemoryStream> stream(new TMemoryStream());
     auto_ptr<Graphics::TBitmap> bitmap(new Graphics::TBitmap());
     AnsiString EXE = ExtractFileExt(fileName);
      if( EXE ==".jpg" || EXE ==".jpeg" || EXE ==".JPG" || EXE ==".JPEG")
        {
           auto_ptr<TJPEGImage> jpeg (new TJPEGImage());
           jpeg->LoadFromFile(fileName);

           bitmap->Assign(jpeg.get());

        }
          else
          {
              bitmap->LoadFromFile(fileName);
          }
     bitmap->SaveToStream(stream.get());
     //bitmap->SaveToFile("1234.jpg");
     stream->Position = 0;
     DataModule2->ADOQueryPhoto->Parameters->ParamByName("img")->LoadFromStream(stream.get(), ftBlob);
     DataModule2->ADOQueryPhoto->Parameters->ParamByName("id")->Value = DataModule2->ClientDataSetVisid->AsInteger;
     DataModule2->ADOQueryPhoto->ExecSQL();
   }
  catch(...)
      {
       ShowMessage("Íå óäàëîñü îòïðàâèòü ôîòîãðàôèþ â áàçó");
      }


В ADOQueryPhoto: UPDATE photos SET photo=:img WHERE id =:id
параметр img: ftBlob, id: ftInteger.

Получение из базы, при нажатии на кнопку. Картинка появляется в DBImage привязанном к полю photo:
CODE

TWaitCursor cursor(crSQLWait);
         DataModule2->ADOQueryX->Active = false;
         DataModule2->ADOQueryX->Parameters->ParamByName("cur")->Value = DataModule2->ClientDataSetVisid->AsInteger;
         DataModule2->ADOQueryX->Active = true;


Где ADOQueryX имеет в дизайне select photo from photos where id=:cur

Исключение возникает не всегда.
olegenty
Отправлено: 22.11.2006, 12:24


Ветеран

Группа: Модератор
Сообщений: 2412



грабля скорее всего в ODBC драйвере.
Лена
Отправлено: 22.11.2006, 14:55


Мастер участка

Группа: Участник
Сообщений: 501



QUOTE (olegenty @ 22.11.2006, 12:24)
грабля скорее всего в ODBC драйвере.

Наверное так и есть. Вот новый код, пока не дал такого исключения, но думаю все равно оно вылезит:
CODE

try{

     TWaitCursor cursor(crSQLWait);
     AnsiString  fileName = PathFolder;
     auto_ptr<TMemoryStream> stream(new TMemoryStream());
     auto_ptr<TJPEGImage> jpeg (new TJPEGImage());

     jpeg->LoadFromFile(fileName);
     jpeg->CompressionQuality = 10;
     //jpeg->Compress();
     jpeg->SaveToStream(stream.get());
     stream->Position = 0;
     DataModule2->ADOQueryPhoto->Parameters->ParamByName("img")->LoadFromStream(stream.get(), ftBlob);
     DataModule2->ADOQueryPhoto->Parameters->ParamByName("id")->Value = DataModule2->ClientDataSetVisid->AsInteger;
     DataModule2->ADOQueryPhoto->ExecSQL();
    }
catch(...)
      {
       ShowMessage("Íå óäàëîñü îòïðàâèòü ôîòîãðàôèþ â áàçó");
      }


Далее отказ от DBImage потому что он не поддерживает загрзку jpg. Загрузка идет теперь в Image1.

Вернуться в Работа с базами данных в C++Builder