Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > BLOB в InterBase


Автор: RSV 27.8.2005, 21:51
Как в С++ программе загрузить в IB (BLOB поле) картинку?
Не могу разобраться с какими именно классами необходимо работать.
Если можно по подробнее. Заранее спасибо.

Автор: Coocky 29.8.2005, 11:33
Да никак...
Тебе просто нужно сделать это поле текстовым, а в нем ххранить путь к картинке.
Ну а дальше, работай либо с запуском программы, для отображения картинки, либо с загрузкой картинки....

Автор: chaos 29.8.2005, 11:53
почему ни как?
Создаешь таблицу как нибудь так
Код

CREATE TABLE NEW_TABLE(
    "Image" BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    "Name" VARCHAR(20))


и потом работаешь с этой таблици из С++ или через CByteArray(VC) или вот однажды занимался этим на CBuilder'e
http://forum.vingrad.ru/index.php?act=ST&f=94&t=56048&unread=1

Автор: chaos 29.8.2005, 12:11
или юзай соответствующие API

Автор: Coocky 29.8.2005, 14:05
А....
Я не правильно прочитал, я подумал не В а ИЗ smile
Ты напиши с чем ты работаешь-- консольный С++, или библиотека GUI ?

Автор: RSV 2.9.2005, 08:46
Цитата(Coocky @ 29.8.2005, 14:05)
А....
Я не правильно прочитал, я подумал не В а ИЗ smile
Ты напиши с чем ты работаешь-- консольный С++, или библиотека GUI ?

Я работаю в GUI.

Автор: chaos 2.9.2005, 08:52
будем постепенно вытягивать из тебя smile
какой гуи: VCL, MFC, QT или еще какой ?
Добавлено @ 08:59
или хотя бы скажи какой IDE пользуешься: MS Visual C++, Borland C Builder... ????

Автор: RSV 2.9.2005, 15:41
Хорошо я все понял был не прав. Пишу клиенское приложение для работы
с IBase. Использую MS VC++7.0. Соответственно пользуюсь MFC(ёй).
Не могу понять как при помощи MFC либо API правильно поместить
изображение в BLOB поле БД IBase? Как затем просмотреть из базы
это изображение, как при необходимости отправить это изображение
на печать? Как проверить пустое BLOB поле или нет?
Заранее благодарен. Серега.

Автор: RSV 2.9.2005, 17:30
Цитата(chaos @ 2.9.2005, 08:52)
будем постепенно вытягивать из тебя smile
какой гуи: VCL, MFC, QT или еще какой ?
Добавлено @ 08:59
или хотя бы скажи какой IDE пользуешься: MS Visual C++, Borland C Builder... ????

Хорошо я все понял был не прав. Пишу клиенское приложение для работы
с IBase. Использую MS VC++7.0. Соответственно пользуюсь MFC(ёй).
Не могу понять как при помощи MFC либо API правильно поместить
изображение в BLOB поле БД IBase? Как затем просмотреть из базы
это изображение, как при необходимости отправить это изображение
на печать? Как проверить пустое BLOB поле или нет?
Заранее благодарен. Серега.

Автор: chaos 3.9.2005, 09:30
вот тебе пока пример записи в блоб, прада без всяких обработок ошибок.
Код

CDatabase oDB;
bool fSuccess = true;

try
{
    oDB.Open("testblob");
}
catch (CDBException *x)
{
    cerr << x->m_strError << endl;
    fSuccess = false;
}

if (! fSuccess)
    return 0;
        
BYTE *Buf = NULL;
DWORD dwSize;

CStdioFile oFileImg;
oFileImg.Open("c:\\testblob.bmp", CFile::typeBinary | CFile::modeRead);
dwSize = oFileImg.GetLength();
Buf = new BYTE[dwSize];
oFileImg.Read(Buf, dwSize);

SQLHSTMT hStmt = NULL;
char soSql[] = "INSERT INTO NEW_TABLE (img) VALUES (?)";

short nSuccess;
nSuccess = ::SQLAllocStmt(oDB.m_hdbc, &hStmt);
nSuccess = ::SQLPrepare(hStmt, (SQLCHAR*)soSql, SQL_NTS);
nSuccess = ::SQLBindParameter(hStmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY,
                        SQL_LONGVARBINARY, 0, 0, Buf, 0, (long *)&dwSize);

nSuccess = ::SQLExecute(hStmt);
    
SQLFreeStmt(hStmt,SQL_DROP);
oDB.Close();
delete[] Buf;


Автор: chaos 3.9.2005, 10:04
а вот тебе еще и для чтения пример(также без проверок на ошибки и тп
)

Код

//...
BYTE *Buf = NULL;
DWORD dwSize;

CStdioFile oFileImg;

CRecordset rs;
rs.m_pDatabase = &oDB;
CDBVariant var;
    
char sql[] = "SELECT img FROM NEW_TABLE WHERE NUM = 1";

rs.Open(CRecordset::forwardOnly, sql, CRecordset::readOnly);

rs.GetFieldValue((short)0, var);
dwSize = var.m_pbinary->m_dwDataLength;

Buf = (BYTE*) GlobalLock(var.m_pbinary->m_hData);
        
BYTE *Buf2 = new BYTE[dwSize];
memcpy(Buf2, Buf, dwSize);
GlobalUnlock(var.m_pbinary->m_hData);

oFileImg.Open("c:\\blob.bmp", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
oFileImg.Write(Buf2, dwSize);

delete[] Buf2;
//...

Добавлено @ 10:06
PS все проверенно и работает smile

Автор: RSV 4.9.2005, 08:31
Цитата(chaos @ 3.9.2005, 10:04)
а вот тебе еще и для чтения пример(также без проверок на ошибки и тп
)

Код

//...
BYTE *Buf = NULL;
DWORD dwSize;

CStdioFile oFileImg;

CRecordset rs;
rs.m_pDatabase = &oDB;
CDBVariant var;
    
char sql[] = "SELECT img FROM NEW_TABLE WHERE NUM = 1";

rs.Open(CRecordset::forwardOnly, sql, CRecordset::readOnly);

rs.GetFieldValue((short)0, var);
dwSize = var.m_pbinary->m_dwDataLength;

Buf = (BYTE*) GlobalLock(var.m_pbinary->m_hData);
        
BYTE *Buf2 = new BYTE[dwSize];
memcpy(Buf2, Buf, dwSize);
GlobalUnlock(var.m_pbinary->m_hData);

oFileImg.Open("c:\\blob.bmp", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
oFileImg.Write(Buf2, dwSize);

delete[] Buf2;
//...

Добавлено @ 10:06
PS все проверенно и работает smile

Огромное спасибо!!!!

Автор: chaos 5.9.2005, 08:43
ПРЕДЛАГАЮ МОДЕРАТОРАМ
добавить в фак работу с блобами


Автор: RSV 5.9.2005, 22:29
Цитата(chaos @ 5.9.2005, 08:43)
ПРЕДЛАГАЮ МОДЕРАТОРАМ
добавить в фак работу с блобами

Сохраненная фотография в .bmp занимает слишком много места около 2.3 Mb
как с этим бороться? Если вариант загрузки в BLOB файла .jpg?
Или способ сжатия .bmp.
С уважением Серега.

Автор: chaos 6.9.2005, 06:22
Цитата(RSV @ 5.9.2005, 22:29)
Сохраненная фотография в .bmp занимает слишком много места около 2.3 Mb
как с этим бороться? Если вариант загрузки в BLOB файла .jpg?
Или способ сжатия .bmp.
С уважением Серега.

а какая нафиг(извеняюсь smile ) разница, можно запихивать хоть бмп, хоть джипег, хоть фильм - это по барабану!!!!
BLOB - длинный битовый объект
читай свой джипег и сохраняй в базе, все тоже самое

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)