Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
25 / 25 / 8
Регистрация: 27.10.2009
Сообщений: 81

выгрузка blob полей в xml и обратная загрузка из xml в blob

07.05.2012, 21:43. Показов 2512. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для работы с xml использовал стандартный TXMLDocument. Собственно, вот функция для выгрузки содержимого blob поля:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
AnsiString TExportForm::BlobToStr(TField *Field)
{
AnsiString str;
TStream *Stream;
int MemSize;
char *Buffer;
 
Stream = Field->DataSet->CreateBlobStream(Field,bmRead);//инициализируем поток
MemSize = Stream->Size;//чтоб сто раз не вызывать функцию
Buffer = new char[MemSize];
Stream->Read(Buffer, MemSize);//записываем поток в буфер
 
for(int i = 0; i < MemSize; i++)//в цикле, побайтно приводим символы в 16ричный вид
{
        AnsiString temp = IntToHex(Buffer[i],2);
        if(temp.SubString(1,6).AnsiCompareIC("FFFFFF") == 0)//убираем мусор, если он есть
                temp.Delete(1,6);
        str += temp;
}
delete[] Buffer;
return str;//собственно строка... вида FFD8FFE100664578696600004D4D0.........
}
и пример использования в цикле...:
C++
1
2
3
4
if(IBPersonQuery->Fields->FieldByNumber(i)->ClassNameIs("TBlobField") && ((TBlobField *)IBPersonQuery->Fields->FieldByNumber(i))->BlobSize)
{
     _di_IXMLNode PersonData->AddChild(IBPersonQuery->Fields->FieldByNumber(i)->FieldName)->SetNodeValue(BlobToStr(IBPersonQuery->Fields->FieldByNumber(i)));
}
С обратным преобразованием пришлось немного помучиться и убить пару часов на чтение форумов. Тут нам понадобиться доп. функция (ссылку не дам ибо уже не помню где её нашёл):
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
int _httoi(const TCHAR *value)
{
  struct CHexMap
  {
    TCHAR chr;
    int value;
  };
  const int HexMapL = 16;
  CHexMap HexMap[HexMapL] =
  {
    {'0', 0}, {'1', 1},
    {'2', 2}, {'3', 3},
    {'4', 4}, {'5', 5},
    {'6', 6}, {'7', 7},
    {'8', 8}, {'9', 9},
    {'A', 10}, {'B', 11},
    {'C', 12}, {'D', 13},
    {'E', 14}, {'F', 15}
  };
  TCHAR *mstr = _tcsupr(_tcsdup(value));
  TCHAR *s = mstr;
  int result = 0;
  if (*s == '0' && *(s + 1) == 'X') s += 2;
  bool firsttime = true;
  while (*s != '\0')
  {
    bool found = false;
    for (int i = 0; i < HexMapL; i++)
    {
      if (*s == HexMap[i].chr)
      {
        if (!firsttime) result <<= 4;
        result |= HexMap[i].value;
        found = true;
        break;
      }
    }
    if (!found) break;
    s++;
    firsttime = false;
  }
  free(mstr);
  return result;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TStream *StrToBlob(AnsiString str)
{
TStream *out_stream = new TMemoryStream;
int BufSize = str.Length();
char Buffer[1];
Buffer[0] = '\0';
AnsiString temp;
 
for(int i = 1; i <= BufSize; i += 2)
{
        AnsiString s = str.SubString(i,2);//читаем по 2 символа из строки
        Buffer[0] = _httoi(s.c_str());//приводим их в 16ричный вид
        temp += Buffer[0];
}
out_stream->Write(temp.c_str(),BufSize/2);//записываем размером BufSize/2 так как 2 символа из исходной строки после конвертации превращаются в 1 байт, тобишь в 1 символ 
return out_stream;
}
Ну и пример использования:
C++
1
2
3
4
5
6
7
_di_IXMLNodeList PersonData =....;
for(int q = 0; q < PersonData->Count; q++)
{
........
     if(AnsiString(PersonData->Get(q)->GetNodeName()).AnsiCompareIC("foto") == 0)//если нашли нужный узел
          OraPersonQueryFOTO->LoadFromStream(StrToBlob(PersonData->Get(q)->GetNodeValue()));
}
Если где можно оптимизировать, с радостью выслушаю, а так, код рабочий, проверено. Для справки, данные выгружаются и БД Interbase в БД Oracle
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2012, 21:43
Ответы с готовыми решениями:

Считать данные из BLOB-XML - PHP БД
Здравствуйте. Есть поле в базе данные типа BLOB. В нем храниться XML текст, такой : &lt;test&gt; &lt;results...

Загрузка из Blob на сервере Excel файла и выгрузка его в память с целью вывода на клиенте для просмотра
Здравствуйте, есть следующая функция //Загрузка файла из таблицы BLOBS function GetBLOBSFile(id : Integer; FilePath : String = '')...

Выгрузка в XML файл результатов запроса. Создание xml схемы с имеющегося xml файла
Доброго времени суток. Имеется необходимый для загрузки пример XML файла и из него необходимо построить XML схему для выгрузки данных...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2012, 21:43
Помогаю со студенческими работами здесь

Загрузка выгрузка с xml в 1с
Здравствуйте, помогите доделать работу. Как сделать так, чтобы сохраненные в xml организации сотрудника загружались в справочник? и как ...

Многоразовая выгрузка из поля Blob
Здравствуйте. Возникла необходимость создания чего-то наподобие фотогалереи. Имеем Delphi XE6, БД Firebird, поле Blob, в котором хранятся...

Blob, выгрузка в директорию клиента
Существует таблица со столбцом типа BLOB. Как выгрузить то, что там лежит в директорию на клиенте ? Oracle 8i, Windows2000

Выгрузка загрузка данных в xml 1C 8.2 УТ 11
Всем привет. Имеется база наработанная но в ней много косяков. Хотим сделать базу новую, чистую и перенести в неё из старой номенклатуру,...

План обмена и выгрузка/загрузка из XML
Добрый день! Прошу объяснить и рассказать, и не казнить. я начинающий 1с-ник.. Вот наконец-то и я дошел до темы, обмен между базами. Суть...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru