|
|
|
ATL OLE DB BLOB
|
|||
|---|---|---|---|
|
#18+
Добрый день. Помогите плз, не могу записать 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(); Подскажите, что я делаю не так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 11:39 |
|
||
|
ATL OLE DB BLOB
|
|||
|---|---|---|---|
|
#18+
А так ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2004, 16:21 |
|
||
|
ATL OLE DB BLOB
|
|||
|---|---|---|---|
|
#18+
Спасибо за предложение. интересный вариант, но не пробывал еще. Я вот вчера сделал на основе 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(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2004, 09:24 |
|
||
|
ATL OLE DB BLOB
|
|||
|---|---|---|---|
|
#18+
Подскажите откуда взят класс CISSHelper. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2005, 07:29 |
|
||
|
ATL OLE DB BLOB
|
|||
|---|---|---|---|
|
#18+
Класс 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 были связаны с данными? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2005, 08:29 |
|
||
|
|

start [/forum/topic.php?fid=57&tid=2033744]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
169ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 488ms |

| 0 / 0 |
