25 / 25 / 8
Регистрация: 27.10.2009
Сообщений: 81

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

07.05.2012, 21:43. Показов 2527. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru