Форум программистов, компьютерный форум, киберфорум
Visual C++: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
 Аватар для Serpico
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 157

Скачать и загрузить файл blob поля в ORACLE (ocilib)

29.03.2019, 15:38. Показов 4131. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Не могу понять как можно скачать и загрузить файл blob поля. Использую библиотеку ocilib. Может кто сталкивался или может помочь.
Вот что я пока написал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#pragma comment(lib, "ociliba.lib")
 
#include <ocilib.hpp>
 
using namespace ocilib;
 
class OraConnection
{
public:
    OraConnection(void);
    bool Open(void);
    void Close(void);
    bool Upload(void);
    bool Download(void);
    ~OraConnection(void);
private
    :Connection con;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "StdAfx.h"
#include "OraConnection.h"
#include <iostream>
#include "global.h"
 
using namespace ocilib;
using namespace std;
 
OraConnection::OraConnection(void)
{
    Environment::Initialize();
}
 
//открыть соединение
bool OraConnection::Open()
{
    try
    {       
        con.Open("ServerName", "LoginName", "PasswordName");
        return true;
    }   
    catch (Exception ex)
    {
        cout << ex.what();
        return false;
    }   
}
 
 
//закгрузить файл
bool OraConnection::Upload()
{
    //TODO: доделать
    return false;   
}
 
 
//скачать файл
bool OraConnection::Download()
{
    //TODO: доделать
    return false;   
}
 
//Закрыть соединение
void OraConnection::Close()
{
    con.Close();
    Environment::Cleanup();
}
 
 
OraConnection::~OraConnection(void)
{
    con.Close();    
}
Добавлено через 2 часа 18 минут
С загрузкой blob в базу я разобрался
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//загрузить файл
bool OraConnection::Upload()
{
    try
    {   
        //открываем файл
        std::ifstream file(file_path, std::ios::in | std::ios::binary | std::ios::ate);
        if (file.is_open())
        {
            //получем размер и позицию
            size_t size = static_cast<size_t>(file.tellg());
            file.seekg(0, std::ios::beg);
            
            Statement st(con);
            Blong blobColumn(st);
 
            //формируем запрос с парамером
            std::string sql = "UPDATE MyTable set BlobField = :BLOB WHERE id = 1";
            st.Prepare(sql);
 
            //назначаем макс. размер для передачи
            st.SetLongMaxSize(static_cast<unsigned int>(size));
            //привязка параметра к открытому файлу
            st.Bind(":BLOB", blobColumn, static_cast<unsigned int>(size), BindInfo::In);
 
            //выполнение
            st.ExecutePrepared();
            unsigned char *strBuffer = new unsigned char[size];
            file.read(reinterpret_cast<char *>(strBuffer), size);
 
            //запись
            blobColumn.Write(Raw(strBuffer, strBuffer + size));
            delete[] strBuffer;         
 
            //закрывает файл и коммитим
            file.close();
            con.Commit();
 
            return true;
        }
        
        return false;
    }
    catch(std::exception &ex)
    {
         std::cout << ex.what() << std::endl;
         return false;
    }   
    
}
Добавлено через 1 минуту
Но я всё еще не знаю как скачать файл с Blob поля и сохранить его на диск.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2019, 15:38
Ответы с готовыми решениями:

Как получить файл из BLOB поля БД (oracle) через ODBC
Подскажите пожалуйста как можно средствами php загрузить файл из таблицы с BLOB полем. Таблица на сервере oracle. Подключение к серверу...

Сохранить в графический файл (tif, jpg, bmp) изображение из blob-поля Oracle
Добрый день, столкнулся с проблемой. В проекте на Delphi есть возможность инсертить в оракловую базу pdf и графические файлы (tif, jpg,...

Скачать файл через blob
Всем привет! Нужно реализовать метод который будет скачивать файл через blob. Желательно асинхронный метод Заранее спасибо!

1
 Аватар для Serpico
3 / 3 / 1
Регистрация: 16.02.2011
Сообщений: 157
01.04.2019, 10:42  [ТС]
Я и как сохранять на диск разобрался
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//скачать файл
bool OraConnection::Download()
{
    try
    {       
        //Command для выполнение запроса
        Statement st(con);
        Blong blobColumn(st);
 
        //формируем запрос с парамером
        std::string sql = "SELECT BlobField FROM MyTable WHERE id = 1";
 
        st.Execute(sql);
        Resultset rs = st.GetResultset();
        rs.Next();
 
        //считываем блоб и определяем размер
        Blob blobField = rs.Get<Blob>(1);
        big_uint size = blobField.GetLength();              
    
        //создаем файл
        std::ofstream outf(file_path, std::ios::out | std::ios::binary);
        std::streamsize sizeBlock = 1024*64;//64 kb
 
        //размер записынх блоков
        int writesize = 0;
 
        if (outf.is_open())
        {            
            //outf.write((const char*)&blobField.Read(size)[0], size); //запись всего файла сразу
            do 
            {
                //если остаётся считать меньше размера sizeBlock, то назначаем размер последнего блока
                if (size - writesize < sizeBlock)   
                    sizeBlock = size - writesize;
                
                //записываем прочтеный блок из blob в файл
                if (!outf.write((const char*)&blobField.Read(sizeBlock)[0], sizeBlock)) 
                {
                    std::cerr << "write file error\n";
                    return false;
                }
                //увеличиваем счётчик прочитаных байт
                writesize += sizeBlock;
            } while(writesize < size); //пока размер записаных байт не будет >= размеру blob из базы
 
        }
        outf.close();   
        return true;
    }
    catch(std::exception &ex)
    {
         std::cout << ex.what() << std::endl;
         return false;
    }   
}
Добавлено через 34 секунды
Какой я молодец. Сам спросил, сам ответил )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.04.2019, 10:42
Помогаю со студенческими работами здесь

На клиенте в двоичный файл загрузить данные из BLOB
Подскажите, как на клиенте в двоичный файл загрузить данные из BLOB. Можно ли это сделать из Forms'ов 6i напрямую ?

Взять файл из поля BLOB и создать
Приветствую. Появилась задачка такая, в БД (Oracle) есть табличка в ней колонка типа BLOB с xls файликами. Задача состоит в том чтобы взять...

Вывод в файл содержимого blob-поля - Savetostream не продекларирован
пишет что savetostream не продекларирован. Что ему нужно? Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...

Как не сохраняя на диске открыть файл из Blob-поля (mssql)
Привет всем. Появилась необходимость разобраться с сохранением и чтением файлов в БД MS SQL средствами делфей. Разобрался с сохранением...

Загрузить/скачать файл по FTP протоколу
Господа, будьте добры, необходим рабочий пример. Заранее всем большое спасибо! Не могу найти нормальный рабочий пример..


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru