Чтение Database из двоичного потока (Stream)

Автор Тема: Чтение Database из двоичного потока (Stream)  (Прочитано 4176 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Доброго времени суток.

Можно ли как-то получить Database из бинарного потока (Stream)? Например, DWG файл с определением блока хранится в виде записи в базе данных некоторой СУБД. Очень не хочется заниматься распаковкой DWG во временный файл с последующим его чтением и уничтожением.

Спасибо

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
ИХМО - это тот случай когда сделать "в лоб" не грех. А вот по поводу файлов в СУБД - это в свое время рассматривалось как предательство Родины.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
в основе любой точки зрения должны лежать объективные основания :)

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Объективно - автокад в разы дольше работает с файлом нежели идет его копирование на жесткий диск, то-же самое по загрузке из БД - создай виртуальный диск и посмотри выйгрышь - загрузка бинарника из БД с "перехукиванием" потока в файл это как кожанный салон с подогревом руля на ВАЗ 2103 - лучше он от этого не станет.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Извиняюсь что влез не в свою тему.

Я с Автокадом работал очень мало, тем не менее, задачка выглядит скорее чисто дотентовская, чем автокадовская.

Если бы мне понадобилось работать именно с бинарным потоком, то я бы создал небольшую обертку типа вот такой:

Код - C# [Выбрать]
  1.     public class BinaryDataDatabaseCreator : IDisposable
  2.     {
  3.         private Database _database;
  4.         private string _tmpDwgFile ;
  5.  
  6.         public BinaryDataDatabaseCreator(byte[] databaseBinaryData)
  7.         {
  8.             // создаем временный файл в папке TEMP. Расширение файла .tmp
  9.             _tmpDwgFile = Path.GetTempFileName();
  10.  
  11.             // Если нужно расширение dwg, то меняем
  12.             _tmpDwgFile = Path.ChangeExtension(_tmpDwgFile, "dwg");
  13.  
  14.             File.WriteAllBytes(_tmpDwgFile, databaseBinaryData);
  15.  
  16.             // читаем dwg файл. Как это правильно делать, думаю вы знаете.
  17.             _database = new Database(_tmpDwgFile);
  18.         }
  19.        
  20.         public Database Database
  21.         {
  22.             get { return _database; }            
  23.         }
  24.  
  25.         public void Dispose()
  26.         {
  27.             // удаляем временный файл
  28.             File.Delete(_tmpDwgFile);
  29.  
  30.             // Если класс Database реализует интерфейс IDisposable (не знаю так это или нет),
  31.             // то для него тоже выполним метод Dispose()
  32.             _database.Dispose();
  33.         }
  34.     }

Использование:
Код - C# [Выбрать]
  1.             var data = GetDwgBinaryDataFromDatabase();
  2.  
  3.             using (BinaryDataDatabaseCreator dataDatabaseCreator = new BinaryDataDatabaseCreator(data))
  4.             {
  5.                 var database = dataDatabaseCreator.Database;
  6.  
  7.                 // Дальше работаем с базой по своему усмотрению
  8.  
  9.             } // Здесь .NET сам позаботиться о том чтобы удалить временный файл

Понятное дело что здесь все равно в итоге идет работа через файл. Тем не менее, беспокоиться каждый раз об удалении файла уже не нужно. 

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Если бы мне понадобилось работать именно с бинарным потоком, то я бы создал небольшую обертку типа вот такой:
Это решение, конечно же, очевидно и напрашивается само собой, однако... Вы же понимаете, что это не совсем то, о чём я спрашивал. :) Суть вопроса в том, чтобы читать из потока (MemoryStream), что называется "на лету". Подозреваю, что это не удастся, но мало ли, чем чёрт не шутит... Может всё же есть недокументированные функции C++ для которых можно было бы написать обёртку.

За код, конечно же, спасибо. :)