| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > Документ MS Office (Word или Excel) в БД |
| Автор: Roo 17.1.2006, 12:52 |
| Как оптимальнее хранить документ MS Office (Word или Excel) в БД? Т.е. чтобы он не был доступен на диске в виде файла, а напрямую хранился в БД? Как это реализовать? Не могу ничего по этому поводу в MSDN найти. |
| Автор: arilou 17.1.2006, 16:20 |
| Юзай тип поля image в SQL Server'е. В нем могут храниться любые бинарные данные. |
| Автор: Roo 17.1.2006, 21:21 |
| Спасибо, arilou! Правда, не могу докопаться до того, как это реализовать (т.е. как документ вёрда записать побайтово в БД и вообще хранить в байтовом виде).. |
| Автор: arilou 18.1.2006, 18:13 |
| Roo Он и так уже в бинарном виде. Просто читаешь его в байтовый массив и пишешь в поле через parametrized query (UPDATE MyWordFileTable SET WordDocument = ?, где ? - параметр запроса, передаваемый через SqlCommand.Parameters). |
| Автор: Roo 18.1.2006, 20:55 |
| "Просто читаешь его в байтовый массив" с этим проблема... как Document в byte[] переписать? подробных описаний вёрдовских методов нигде не встречал... |
| Автор: mr.DUDA 19.1.2006, 10:46 | ||
Выложил пример, как это делается с пом. clipboard: http://forum.vingrad.ru/index.php?showtopic=80123&view=findpost&p=621325 |
| Автор: arilou 19.1.2006, 11:53 |
| С файлами работать умеешь? |
| Автор: Roo 19.1.2006, 13:18 | ||
Умеем-с, только с вёрдом не ахти как |
| Автор: arilou 19.1.2006, 15:12 |
| Открываешь файл, считываешь в byte[] и кладешь в БД. В чем именно сложность? |
| Автор: mr.DUDA 19.1.2006, 16:24 |
| Roo, посмотри ссылку которую я дал, там всё написано. |
| Автор: RedButterfly 2.9.2008, 15:09 | ||
сложность в том как преобразовать документ в объект... |
| Автор: arilou 3.9.2008, 11:46 |
| RedButterfly, для чего? |
| Автор: Wanderer2019 3.9.2008, 12:30 | ||
Тебе и не нужен объект ворда. Читаешь файл как любой другой - произвольного типа. Что то типа вот -
После чего в file_bytes у тебя и есть этот док файл в виде массива байт. |
| Автор: RedButterfly 3.9.2008, 12:59 | ||
Чтобы он хранился в виде поля image в базе данных. Чтобы как Вордовский документ нигде не существовал. Чтобы залить его в базу и вытаскивать оттуда. |
| Автор: Idsa 3.9.2008, 13:36 |
Image - устаревший тип. Рекомендуется использовать varchar(max). Весьма спорное решение. Все-таки DBA сходятся в том, что blob-данные лучше хранить на жестком диске, а в базе хранить только указатель на них. Я сам недавно столкнулся дилеммой "хранить blob-данные в базе или нет". Провел тестирование под MS SQL Server 2005. Пришел к выводу, что на производительность запросов (тех, которые не задействуют сами blob-данные) хранение blob-данных в базе не влияет (насколько я помню, эти данные просто хранятся в отдельной области в базе данных, поэтому их присутствие не сказывается на производительности). Однако есть еще пара нюансов. Например, уже так просто не откроешь в Management Studio (или в любом другом клиенте) табличку (а в процессе разработки это очень удобно): открытие таблицы, которая весит гигабайт (это так, для начала 1. Скачивать файл на клиент полностью нельзя, т. к. передача на клиент, например, 2 гигабайт данных просто убьет среднестатистическую тачку (OutOfMemoryException). Нужно использовать последовательное считывание и обработку (например, запись на жесткий диск на клиенте). Пример такого считывания я уже как-то приводил. 2. Если считывать большие файлы из базы, очень долго будет открыт connection к базе. Насколько я могу судить, connection к базе - гораздо более серьезный ресурс, нежели connection к серверу (при традиционном хранении файлов). Кроме того, если я не ошибаюсь, на некоторые СУБД есть лицензии, которые ограничивают количество одновременных соединений. |
| Автор: RedButterfly 3.9.2008, 13:56 | ||
очень интересные замечания Дело в том, что я до конца не могу определиться как лучше всего сделать прогу, а именно: в программе есть TreeView, кликая на ветки которого, пользователи, сидящие в разных местах (будет распределенное приложение) будут открывать эти файлы - документы Word (для начала) будут создавать, изменять, удалять, перемещать по дереву и т.д. пишу под vs2005 + sqlserver2005 файлы большие, тяжелые и с разнообразным содержимым кучу файлов потом надо будет сливать в один (соединить документы ворд) и такой файл будет весить метров 200-300-400...естественно его тоже будут смотреть...))) Руководство желает, чтобы вся информация хранилась в базе данных. Мне же кажется удобным и безопасным (кто знает что может стать с этой БД) хранение и в БД и в защищенном месте в виде файлов. С удовольствием выслушаю советы |
| Автор: RedButterfly 3.9.2008, 15:04 |
| интересный проект делаете на будущее посоветуйте пожалуйста литературу по распределенным приложениям скоро выложу что у меня получилось на этом этапе |
| Автор: Idsa 3.9.2008, 15:25 | ||
Тот проект, про который я говорил, - ASP.NET портал. В Вашем же случае я посоветовал бы WCF. |
| Автор: RedButterfly 4.9.2008, 06:40 | ||||
А можно расшифровать? |
| Автор: Idsa 4.9.2008, 06:44 |
Что именно расшифровать? |
| Автор: MasterOfCode 4.9.2008, 08:20 |
| Хранение данных используя нереляционные хранилища тоже чреваты некими сложностями. Например: 1. Доступ к файлам учетных записей домена. 2. Отсутствие резервного копирования. поясню: 1. Столкнулся когда писал приложение, в БД хранились пути к файлам, пользователь указывает что хотел бы просмотреть этот документ, а его не пускает туда, как оказалось такова политика отдела безопасности. А пользователь видит еще те файлы которые ему видеть не надо, его туда даже не пустит. Еще почему то когда учетной был дан доступ, фреймверк переодически стрелял с ошибкой доступа, получался доступ к файлу через раз. 2. Здесь преимущества тоже за БД, у нее есть хорошее свойство как backup/restore, вслучаи чего можно восстановить, если же полетит хард у сервера (что не редкость), то восттановить сложновато. Но все же это вопрос на который нет однозначного ответа. У нас маленькие файлы хранятся в БД. Большие хранятся на сервере в файловой системе. файловая система дублируется, 3 сервера, все 3 в разных городах, в случае чего, восстановить можно и файлы. |
| Автор: RedButterfly 4.9.2008, 08:25 | ||||
расшифровала WCF-Windows Communication Foundation так? Добавлено через 3 минуты и 37 секунд
сервер один..и он без зеркал... можете дать примеры книг/статей/прочего для написания приложения работающего по сети? |
| Автор: Wanderer2019 4.9.2008, 11:20 | ||
Вы для начала попробуйте открыть файл размером 400 метров вордом =) |
| Автор: RedButterfly 4.9.2008, 11:55 | ||||||||||
нуу) он завсинет же).... но пользователи верят, что смогут терпеливо открывать такие файлы... )) пока вот что у меня получилось Это открытие файла и копирование его в другое место.
Этот метод делает из файла байты:
а так из байтов документ ворд получается...
Я вот думаю, нужно ли эти документы сериализовать? |
| Автор: MasterOfCode 4.9.2008, 12:01 | ||||
Так на вскидочку.
Если файл будет 400 Мб, эта строка вызовет зависание программы.
fileStream.Close(); не выполнится, т.к. процедура прекратит работать строчкой выше. |
| Автор: RedButterfly 4.9.2008, 13:18 |
| учла |
| Автор: RedButterfly 5.9.2008, 06:05 | ||||||||
| что-то я не пойму :( если вот так добавить значение в базу данных - оно добавляется из TextBox: я думаю, что тут написано криво, но работает....
а вот так не добавляет:
где
вот тут
выскакивает такое окошечко |
| Автор: MasterOfCode 5.9.2008, 06:35 | ||
Так попробуй. |
| Автор: RedButterfly 5.9.2008, 09:02 | ||||||
не помогло :( выскакивают уже два окошкас одинаковой ошибкой, в которых говорится,что поле ожидает, что в него положат значение...и не дожидается...как я поняла.... на это
|
| Автор: MasterOfCode 5.9.2008, 09:05 |
| Внимательней: не insertCommand.Parameters.Add("@Context",SqlDbType.Image, Context.Length); а, insertCommand.Parameters.Add("@Context",SqlDbType.Image, Context.Length).Value = Context; |
| Автор: RedButterfly 5.9.2008, 09:24 | ||
| Урра добавляет))) вот:
однако ошибка все-равно выскакивает... сейчас буду разбираться... я почему-то думаю, что ругается вот так потому что программа (датагридвью) не может показать эти данные... |
| Автор: RedButterfly 5.9.2008, 09:51 | ||||
| догадки оказались верными итак: добавление документа Ворд (Эксель думаю наподобие будет) выглядит так:
|
| Автор: RedButterfly 5.9.2008, 12:12 |
| Делаю считывание из базы данных в документ Word |
| Автор: RedButterfly 5.9.2008, 14:02 | ||
| Странно однако. Взяла пример считывания BLOB-поля из базы данных из MSDN. Вставила в свой код и не работает.
может у кого есть работающие примеры? раз в MSDN немного не так написано... Добавлено через 6 минут и 7 секунд Пишет вот такую ошибку: |
| Автор: RedButterfly 5.9.2008, 14:39 | ||
| вот так тоже не считывает и пишет ошибки
пример взят отсюда http://www.gotdotnet.ru/LearnDotNet/NETFramework/44742.aspx я уже не знаю :( где же искать информацию если не в MSDN и не на сайтах, посвященных программированию? |
| Автор: MasterOfCode 8.9.2008, 08:09 | ||
| byte[] dataCon = new byte[bytesize]; - Исправь! bytesread += dataReader.GetBytes(0, curpos, dataCon, (int)curpos, chunkSize); - тут тоже! Вы пробовали сами пытаться исправлять свои синтаксические ошибки?
Если пример взяли и он не работает, 99,99% в том что он не работает - это вина ваша, а не тех кто опубликовал. |
| Автор: RedButterfly 8.9.2008, 14:23 | ||||
спасибо вы правы. скоро выложу что получилось на данном этапе...вдруг кому понадобится... |
| Автор: RedButterfly 9.9.2008, 10:12 |
| :( Люди! Люди! Писала я писала значит....и тут объяснили таки , что писать нужно с использованием ООП... ООП это хорошо конечно. Но неужели так важно? Итого: три класса (никак не связанных с винформс) должны работать с формой... что-то потерялась я... неужели эту прогу нужно именно с использованием ООП писать? |
| Автор: MasterOfCode 9.9.2008, 10:39 |
Что вы понимаете под ООП? |
| Автор: RedButterfly 9.9.2008, 12:27 | ||
три класса со всякими переменными, свойствами, функциями...и каждая работает с формой...и управляют формой..и вызывают друг друга... |
| Автор: MasterOfCode 9.9.2008, 12:37 |
| Так и есть, реализовывать желательно все через классы. Это дает несравнимые преимущества с обычным программированием в лоб. |
| Автор: RedButterfly 9.9.2008, 12:55 | ||
тоже самое сказали... ... может уже тогда опаздавший вопрос задам: что и где прочитать по ООП + С#? простите конечно за навязчивость... |
| Автор: MasterOfCode 9.9.2008, 12:57 |
| ОффТОП! http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 |
| Автор: RedButterfly 9.9.2008, 13:35 |
| спасибо)) я скоро ... |