Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранение файлов в БД и доступ к ним из проги, Как хранить файлы в базе данных? 
:(
    Опции темы
albert21
  Дата 7.10.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Здравствуйте.
Есть такая задача: хранить документы (.pdf, .doс, .html возможно и другие) в базе данных. По запросу пользователя давать возможность скачать выбранный файл. База данных MS SQL

Подскажите как можно реализовать такую возможность.
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
mr.DUDA
Дата 7.10.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Завести поле с типом varbinary(MAX) и работать с таблицей через датасет. В датасете такое поле будет массивом байтов.


--------------------
user posted image
PM MAIL WWW   Вверх
albert21
Дата 7.10.2006, 17:31 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Цитата

Завести поле с типом varbinary(MAX) и работать с таблицей через датасет. В датасете такое поле будет массивом байтов.


Допустим пользователь указал путь к некоторуму файлу, как заполнить это поле в датасет? Сериализовать? Как код должен примерно выглядеть?
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
mr.DUDA
Дата 7.10.2006, 19:59 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Открываем файл, считываем в массив, добавляем DataRow в датасет, пихаем в поле row-а считанный массив, сохраняем датасет датаадаптером в БД. Файл читать можно через FileStream, датасет подойдёт обычный (нетипизированный), либо автосгенерированный с таблицы базы данных, адаптер юзаем SqlDataAdapter.


--------------------
user posted image
PM MAIL WWW   Вверх
albert21
Дата 14.10.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Спасибо, mr.DUDA! Вроде получается.
Только вот создать поле типа varbinary(MAX) в таблице БД не удалось. Ругается MS SQL.
Сделал просто varbinary. В связи с этим вопрос: смогу ли сохранять файлы произвольного размера?
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
mr.DUDA
Дата 14.10.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Похоже на то, что MAX появилось только в 2005-м SQL Server. Если юзать varbinary без MAX, максимальный размер данных будет 8000 байт. В 2000-м надо использовать один из типов полей: text, ntext или image.


--------------------
user posted image
PM MAIL WWW   Вверх
albert21
Дата 28.10.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Использую тип поля Image, при вставке новой записи компьютер сильно задумывается при чём на долго затем появляется окошко с сообщением "Error askid thread to die!", в конце концов генерится исключение "Query timeout expired". Самое интересное то, что запись всё таки вставляется в полном объёме, т.е. прочитав данные из поля можно восстановить файл. Как быть с тормозами и вышеупомянутыми сообщениями? Подскажите!


Код

            OleDbCommand command = new OleDbCommand("add_el_book", oleDbConnection);    
            command.Connection = oleDbConnection;    
            command.CommandType = CommandType.StoredProcedure;    
            OleDbParameter nameParam = null;    
            OleDbParameter kolParam = null;    
            OleDbParameter mParam = null;    
            nameParam = command.Parameters.Add(new OleDbParameter("@name",  OleDbType.VarChar));    
            nameParam.Direction = ParameterDirection.Input;    
            nameParam.Value = "qqq";    
            kolParam = command.Parameters.Add(new OleDbParameter("@kol", OleDbType.Integer));    
            kolParam.Direction = ParameterDirection.Input;    
            kolParam.Value = 1;    
            mParam = command.Parameters.Add(new OleDbParameter("@m", OleDbType.LongVarBinary));    
            mParam.Direction = ParameterDirection.Input;    
            mParam.Value = mas;    
            oleDbConnection.Open();    
            command.ExecuteNonQuery();    
            oleDbConnection.Close();    
    

Код

CREATE PROC add_el_book    
@name varchar(255),    
@kol int,    
@m Image    
AS    
INSERT INTO Book(Название, Количество_всего, Электронная_версия) VALUES (@name, @kol, @m)


--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
mr.DUDA
Дата 29.10.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Выставить в connection string-е тайм-аут побольше (см. http://www.connectionstrings.com), юзать не OleDbConnection etc. а SqlConnection и SqlCommand etc.


--------------------
user posted image
PM MAIL WWW   Вверх
albert21
Дата 29.10.2006, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Цитата

Выставить в connection string-е тайм-аут побольше (см. http://www.connectionstrings.com), юзать не OleDbConnection etc. а SqlConnection и SqlCommand etc.


На сколько больше? Можно о тайм-ауте подробнее, за что он отвечает, зачем нужен, как работает?

Добавлено @ 21:05 
Как связан тайм-аут и размер файла?
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
mr.DUDA
Дата 29.10.2006, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(albert21 @  29.10.2006,  20:03 Найти цитируемый пост)
Можно о тайм-ауте подробнее, за что он отвечает, зачем нужен, как работает?

Соединение имеет тайм-аут, зависящий от дефолтных настроек БД и строки соединения. По истечении времени тайм-аута, соединение разрывается. Если операция вставки записи в БД занимает больше времени, чем по дефолту отводит провайдер MS SQL, то даже при нормальном исходе соединение будет оборвано. Количество секунд на тайм-аут можно прописать в настройках базы или в строке соединения, для MS SQL нужно указать ";Connection Timeout=количество_секунд".

Возможно проблему можно решить, используя не OLE DB provider, а managed provider для MS SQL, имеющий бОльшую производительность - это классы пространства имён System.Data.SqlClient; если операция вставки большой записи будет производиться быстрее, то и выхода за тайм-аут не будет.

З.Ы. а насколько большие файлы сохраняются в поле Image ? 100 килобайт ? 10 мегабайт ?


--------------------
user posted image
PM MAIL WWW   Вверх
albert21
Дата 30.10.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Цитата

 а насколько большие файлы сохраняются в поле Image ? 100 килобайт ? 10 мегабайт ?


В базе данных должны хранится электронные документы (главным образом книги) различных форматов. PDF книжки могут быть весьма увесистым! smile Я исхожу из того, что размер файла, который может быть помещён в БД, не должен быть  ограничен
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
albert21
Дата 31.10.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Есть ли файл-серверы, под которые можно было бы написать своего клиента на C#?
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
mr.DUDA
Дата 31.10.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(albert21 @  31.10.2006,  11:19 Найти цитируемый пост)
Есть ли файл-серверы, под которые можно было бы написать своего клиента на C#?

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


--------------------
user posted image
PM MAIL WWW   Вверх
albert21
Дата 31.10.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Возможно прийдётся реализовывать версионность документов. Просто файлы слишком громоздко, путанно! Хотя тоже вариант. 
Я слышал о SharePoint Portal Server, у этой проги API иметтся для доступа к возможностям. mr.DUDA, никогда не работал с ней? 
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
mr.DUDA
Дата 31.10.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



SharePoint имхо лучше не трогать, это вообще отдельная тема, скорее CMS чем файловый сервер, и гемора с установкой и настройкой масса.


--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1968 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.