проблема с BLOB

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Алексей1153
Сообщения: 4
Зарегистрирован: 09 апр 2005, 15:22

проблема с BLOB

Сообщение Алексей1153 » 09 апр 2005, 15:27

всем привет
(думаю с подфорумом не ошибся, но если что - не бейте)

я пишу на VC++6 , и юзаю базу типа *.FDB или *.GDB из VC посредством Firebird 1.5

в таблице objects есть поле picture с сами понимаете чем.

если картинка BMP уже есть в таблице, то я читаю её -

(тут код на c++, если кому-то нужно, в смысле - точнее понять, о чём я, я толком не могу объяснить :) )

НЕКАЯ ПРОЦЕДУРА()
{
CRecordset rs(&m_base);
// m_base - это объект CDataBase подключенный к открытой базе
CDBVariant var;
CString txt,sql;
sql="SELECT picture FROM objects WHERE nomer=3";
DWORD dwdDataLen;
BYTE* pbyData;

try
{
//запуск SQL
rs.Open(CRecordset::snapshot,sql,CRecordset::readOnly);
rs.GetFieldValue((short)0,var);

//длина BLOB
dwdDataLen=var.m_pbinary->m_dwDataLength;

if(dwdDataLen<2000000)
{
DWORD read=0;

//достаюм данные - суть файл формата BMP
//(проверил по хексам)

var.m_pbinary->m_hData;

pbyData =(BYTE*) GlobalLock(var.m_pbinary->m_hData);
//pbyData - буфер с файлом BMP в ОЗУ



if(pbyData)
{
BITMAPFILEHEADER* pBmpFileHeader;
BITMAPINFOHEADER* pBmpInfoHeader;
BITMAPINFO* pBmpInfo;

pBmpFileHeader=(BITMAPFILEHEADER*)pbyData;
pBmpInfoHeader=(BITMAPINFOHEADER*)(pbyData+sizeof(BITMAPFILEHEADER));
pBmpInfo=(BITMAPINFO*)pbyData;

BYTE* pPixels=pbyData+((BITMAPFILEHEADER*)pbyData)->bfOffBits;
CBitmap Bmp;

BOOL res=Bmp.CreateBitmap(30,30,1,24,pPixels);

CDC* pdc;
pdc=GetDC();
pdc->FillSolidRect(100,100,30,30,RGB(255,0,0));
res=pdc->DrawState(CPoint(100,100),CSize(30,30),&Bmp,DSS_NORMAL,0);
res=Bmp.DeleteObject();
ReleaseDC(pdc);
GlobalUnlock(var.m_pbinary->m_hData);

}

}
rs.Close();
}
catch(...)
{
::AfxMessageBox("ОШИБКА");
}
}

--------
проблемы дальше - как всё-таки считать, изменить и записать BLOB при помощи SQL , который (SQL) я могу запустить by
CString sql="INSERT .... ";
rs.Open(CRecordset::snapshot, sql ,CRecordset::readOnly);


-----------

ещё - слышал я об волшебном препроцессоре gpre.exe, который может по параметру -CXX выцеплять из текстового сишного файла команду
EXEC SQL
sql;

и заменять вызовами API

- расскажите, как это сделать, я не смог...
---------------------------------------------------------------------------------
ЗЫ
спасибо заранее

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 апр 2005, 19:43

если работа идет через ADO, то надо смотреть хелп к АДО по работе с блобами. про препроцессор лучше не думать, это древний препроцессор C, а не C++.

Алексей1153
Сообщения: 4
Зарегистрирован: 09 апр 2005, 15:22

Сообщение Алексей1153 » 10 апр 2005, 16:05

kdv писал(а):если работа идет через ADO, то надо смотреть хелп к АДО по работе с блобами. про препроцессор лучше не думать, это древний препроцессор C, а не C++.
я пользуюсь драйвером ODBC и сервером Firebird 1.5

как при помощи запросов SQL гонять BLOB ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 апр 2005, 19:43

уважаемый, "гонять blob" можно так же как другие типы столбцов. Только что вставлять их можно через параметры. А так все зависит от того, чем вы там к ODBC из MSVC лезете.

CRecordset - это что? Компоненты ADO? Компоненты ODBC? Вот их хелп и надо читать.

Алексей1153
Сообщения: 4
Зарегистрирован: 09 апр 2005, 15:22

Сообщение Алексей1153 » 14 апр 2005, 18:14

Всем спасибо, я разобрался :)

если кому интересно, подробности тут :

http://forum.shelek.com/index.php/topic ... #msg101075

-----------------

kdv, да это ODBC-элементы

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 апр 2005, 18:47

мда. посмотрел я на эти чудо-технологии - ужас. как будто на ассемблере все написано. такие жуткие портянки кода.... И эти люди (MS) называют ЭТО Visual C++... Страшно далеки они от народа...

Алексей1153
Сообщения: 4
Зарегистрирован: 09 апр 2005, 15:22

Сообщение Алексей1153 » 14 апр 2005, 19:13

kdv писал(а):мда. посмотрел я на эти чудо-технологии - ужас. как будто на ассемблере все написано. такие жуткие портянки кода.... И эти люди (MS) называют ЭТО Visual C++... Страшно далеки они от народа...
да брось :)

не так уж всё запущено :)

вот мне - нравится, под винду писать очень удобно, включая и очень серьёзные вещи

McArty
Сообщения: 56
Зарегистрирован: 14 янв 2005, 09:31

Сообщение McArty » 15 апр 2005, 09:21

kdv писал(а):мда. посмотрел я на эти чудо-технологии - ужас. как будто на ассемблере все написано. такие жуткие портянки кода.... И эти люди (MS) называют ЭТО Visual C++... Страшно далеки они от народа...
Хм, KDV - Для БД, может VC++ и не очень удобен, но это только на первый взгляд. Если написать базовых классов, то геморра будет меньше чем в Delphi.
p.s. До сих пор плююсь от среды разработки от Borland. хотя может
дело вкуса, но Borland IDE Dephi2005 подделал под Visual Studio.
А это о чем-то говорит 8)

Ответить