powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ATL OLE DB BLOB
5 сообщений из 5, страница 1 из 1
ATL OLE DB BLOB
    #32446853
lc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lc
Гость
Добрый день.
Помогите плз, не могу записать BLOB в SQL Server ...

Сделал класс для CAccessor
class CDMA_BLOB
{
public:
ISequentialStream* m_Photo;
ULONG m_Photo_Status;
ULONG m_Photo_Length;

BEGIN_COLUMN_MAP(CDMA_BLOB)
BLOB_ENTRY_LENGTH_STATUS(1, IID_ISequentialStream, STGM_WRITE, m_Photo, m_Photo_Length, m_Photo_Status)
END_COLUMN_MAP()
};

Вызываю собсвенно вот так

CCommand<CAccessor<CDMA_BLOB> > cmd2;
CString strCommand;
strCommand = "select [Photo] from [User] where [id]=29";
CDBPropSet dbRowset(DBPROPSET_ROWSET);
dbRowset.AddProperty(DBPROP_ISequentialStream, true);
dbRowset.AddProperty(DBPROP_IRowsetChange, true);
dbRowset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT);

HRESULT hr = cmd2.Open(*pS,strCommand,&dbRowset);

if (hr!= S_OK)
{
::DumpOLEDBErrors();
}
if (cmd2.MoveFirst() == S_OK)
{
if (cmd2.m_Photo_Status == DBSTATUS_S_OK)
{
cmd2.m_Photo->Release();
}
}

CISSHelper iStream; // этот класс взят из примера
int* szBuff;
szBuff = (int*) ::CoTaskMemAlloc(sizeof(int) * 4);
memset(szBuff,10,sizeof(int) * 4);
ULONG u;
iStream.Write(szBuff,sizeof(int) * 4,&u);
cmd2.m_Photo = (ISequentialStream*) &iStream;
cmd2.m_Photo_Length = iStream.m_ulLength;
cmd2.m_Photo_Status = DBSTATUS_S_OK;
hr = cmd2.SetData();
if (hr!= S_OK)
{
// Все вот здесь вываливается ошибка hr = DB_E_BADROWHANDLE
::DumpOLEDBErrors();
}
::CoTaskMemFree(szBuff);

cmd2.Close();
Подскажите, что я делаю не так
...
Рейтинг: 0 / 0
ATL OLE DB BLOB
    #32447647
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CISSHelper iStream; // этот класс взят из примера 
int* szBuff; 
szBuff = (int*) ::CoTaskMemAlloc(sizeof(int) *  4 ); 
memset(szBuff, 10 ,sizeof(int) *  4 ); 
ULONG u; 
cmd2.m_Photo_Length = sizeof(int) *  4 ; 
cmd2.m_Photo_Status = DBSTATUS_S_OK; 
iStream = cmd2.m_Photo;
iStream.Write(szBuff,sizeof(int) *  4 ,&u); 
::CoTaskMemFree(szBuff); 
cmd2.Close(); 
...
Рейтинг: 0 / 0
ATL OLE DB BLOB
    #32448461
lc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lc
Гость
Спасибо за предложение. интересный вариант, но не пробывал еще.
Я вот вчера сделал на основе CDynamicAccessor (вообще-то это взято из примера и работает :) )
Вот как это выглядит, если кому-то это интересно...

CCommand<CDynamicAccessor > cmd2;
strCommand.Format("select [Photo] from [User] where [id]=%d",m_nResultID);
CDBPropSet dbRowset(DBPROPSET_ROWSET);
dbRowset.AddProperty(DBPROP_ISequentialStream, true);
dbRowset.AddProperty(DBPROP_IRowsetChange, true);
dbRowset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT);

hr = cmd2.Open(*pS,strCommand,&dbRowset);

if (hr!= S_OK)
{
::DumpOLEDBErrors(); // ну это мой обработчик ошибок
}

DBSTATUS dbStat;
IUnknown ** pUnk = NULL;
if (cmd2.MoveFirst() == S_OK)
{
pUnk = (IUnknown **) cmd2.GetValue(1);
if (*pUnk)
(*pUnk)->Release();
}

CISSHelper iStream;

ULONG u;
if (iStream.Write(this->m_pPhoto,this->m_nFileLen,&u)!= S_OK)
{
AfxMessageBox("Не удалось записать изображение!");
CDialog::OnOK();
return;
}
*pUnk = (IUnknown*) &iStream; // вот здесь подсовываю новый интерфейс
cmd2.SetLength(1,u); // обязательно указываю размер
dbStat = DBSTATUS_S_OK; // статус
cmd2.SetStatus(1,dbStat);

hr = cmd2.SetData(); // и все
if (hr!= S_OK)
{
::DumpOLEDBErrors();
}
cmd2.Close();
...
Рейтинг: 0 / 0
ATL OLE DB BLOB
    #32903315
Lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите откуда взят класс CISSHelper.
...
Рейтинг: 0 / 0
ATL OLE DB BLOB
    #32903336
Lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс CISSHelper я нашел. Но сразу второй вопрос.

if (cmd2.MoveFirst() == S_OK)
{
pUnk = (IUnknown **) cmd2.GetValue(1);
if (*pUnk)
(*pUnk)->Release();
}
CISSHelper iStream;
ULONG u;
if (iStream.Write(this->m_pPhoto,this->m_nFileLen,&u)!= S_OK)
{.....
В последнем примере мне не понятно откуда беруться параметры:
this->m_pPhoto,this->m_nFileLen для вызова iStream.Write
Насколько я понимаю это область данных полученная после pUnk = (IUnknown **) cmd2.GetValue(1);
Но когда и как m_pPhoto и m_nFileLen были связаны с данными?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ATL OLE DB BLOB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]