На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> MFC, MySQL и фото в базе :)
    Добрый день. Как говорится "никогда такого не было и вот опять!" (Черномырдин)

    Понадобилось мне сохранять фото в mysql, а проблема в том, что приложение делается на MFC подключение к MySQL осуществляется через ODBC. используются стандартные инструменты работы с БД (CDatabase и т.д.) на форуме нашел пример работы, но там используется механизм data exchange как его адаптировать к своей ситуации я придумать не смог, если кто поделиться рецептом решения проблемы буду очень благодарен.
      В чем проблема читать/записывать binary data?
        Да в этом вся проблема
          В чём?
            Я не знаю как используя CDatabase и т.д. писать в базу и читать BLOB поля.
              Если кому надо вот как я это решил:

              Сохранение фото в базу:

              ExpandedWrap disabled
                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;


              Чтение из базы:

              ExpandedWrap disabled
                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;


              Единственно при чтении из таблицы мне приходится сохранять фото во временный файл и на форме показывать уже его. Как сделать это напрямую пока не разобрался.
              Сообщение отредактировано: Sander -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0218 ]   [ 16 queries used ]   [ Generated: 3.05.24, 10:14 GMT ]