Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.51.117] |
|
Сообщ.
#1
,
|
|
|
Добрый день. Как говорится "никогда такого не было и вот опять!" (Черномырдин)
Понадобилось мне сохранять фото в mysql, а проблема в том, что приложение делается на MFC подключение к MySQL осуществляется через ODBC. используются стандартные инструменты работы с БД (CDatabase и т.д.) на форуме нашел пример работы, но там используется механизм data exchange как его адаптировать к своей ситуации я придумать не смог, если кто поделиться рецептом решения проблемы буду очень благодарен. |
Сообщ.
#2
,
|
|
|
В чем проблема читать/записывать binary data?
|
Сообщ.
#3
,
|
|
|
Да в этом вся проблема
|
Сообщ.
#4
,
|
|
|
В чём?
|
Сообщ.
#5
,
|
|
|
Я не знаю как используя CDatabase и т.д. писать в базу и читать BLOB поля.
|
Сообщ.
#6
,
|
|
|
Если кому надо вот как я это решил:
Сохранение фото в базу: BYTE *Buf = NULL; DWORD dwSize; CStdioFile oFileImg; oFileImg.Open(m_photo, CFile::typeBinary | CFile::modeRead); dwSize = oFileImg.GetLength(); Buf = new BYTE[dwSize]; oFileImg.Read(Buf, dwSize); SQLHSTMT hStmt = NULL; char soSql; CString m_sql; short nSuccess; m_sql.Format(_T("UPDATE tab_photo SET P2 = ? WHERE tab_photo.ID = %s"), id_item); soSql = (char) m_sql.GetBuffer(m_sql.GetLength()); nSuccess = ::SQLAllocStmt(db->m_hdbc, &hStmt); nSuccess = ::SQLPrepare(hStmt, (SQLCHAR*) m_sql.GetBuffer(m_sql.GetLength())/*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); delete[] Buf; Чтение из базы: BYTE *Buf = NULL; DWORD dwSize; CStdioFile oFileImg; CRecordset rs; rs.m_pDatabase = db; CDBVariant var; CString m_sql; m_sql.Format(_T("SELECT tab_photo.P2 FROM tab_photo WHERE tab_photo.ID = %s"), id_item); rs.Open(CRecordset::forwardOnly, m_sql.GetBuffer(m_sql.GetLength()), 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("blob.jpg", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); oFileImg.Write(Buf2, dwSize); oFileImg.Close(); delete[] Buf2; Единственно при чтении из таблицы мне приходится сохранять фото во временный файл и на форме показывать уже его. Как сделать это напрямую пока не разобрался. |