Нередко встречаются ситуации, когда в базе данных необходимо хранить различные файлы, имеющие нормальное текстовое отображение, а также информацию об этих файлах. Для того, чтобы облегчить добавление файлов в базу данных, просмотр содержимого этих файлов и навигацию по ним, можно разработать простое приложение на ASP.NET.
335просмотров
Примерами таких файлов могут быть обычные текстовые документы, SQL-запросы, файлы с исходным кодом программ и многое другое. База данных MS SQL позволяет хранить такие файлы (как и любые другие), используя тип данных varbinary, который представляет собой бинарные данные переменной длины. Файл, хранящийся в базе данных в формате varbinary имеет следующий вид:
Для того, чтобы иметь возможность прочитать текстовый файл из БД, необходимо перевести его из бинарного вида. Сделать это можно с помощью следующей SQL-команды:
cast([varbinary_field] as varchar(max))
Для того, чтобы облегчить добавление файлов в базу данных, просмотр содержимого этих файлов и навигацию по ним, можно разработать простое приложение на ASP.NET.
Начнем с создания тестовой таблицы в базе данных. Одно из полей должно быть типа varbinary(MAX), а в остальных полях можно хранить любую информацию о файле (например, описание, дату добавлению в базу данных, автора и т.п.). В нашем примере создадим таблицу с названием файла, описанием, датой добавления, автором и размером файла:
Следующим шагом будет написание front-end части нашего веб-приложения. Она будет состоять из нескольких TextBox, предназначенных для ввода информации о добавляемых файлах, элемента FileUpload для выбора файла в диалоговом окне, таблицы GridView, в которой будут отображаться все файлы и многострочного TextBox для просмотра содержимого файла.
Сначала добавим текстбоксы и кнопку «Добавить». Для их удобного расположения, поместим их в элемент Table:
Опционально можно предусмотреть возможность поиска по файлам, поэтому добавим элементы, необходимые для реализации поиска. Нам нужен текстбокс для ввода поискового запроса, кнопка поиска и кнопка отмены:
Последним этапом создания front-end части будет добавление таблицы для отображения списка файлов. Она будет построена на основе элемента GridView и будет иметь поле описание с прокруткой, чтобы описание не занимало много места на странице, если оно достаточно обширное. Для этого вместо обычных столбцов BoundField мы будем использовать настраиваемый столбец TemplateField с вложенным в него элементом Label, зададим CSS-стиль (overflow-y: auto) и ограничим максимальную высоту ячейки (max-height: 170px):
Теперь перейдем к back-end части приложения. Для сокращения объема кода в статье, будут выбраны только важные его части. В первую очередь при загрузке страницы необходимо заполнить GridView данными из БД. Для этого воспользуемся стандартным простым способом. SQL Запрос, формирующий выборку для объекта SqlDataAdapter самый простой: «select * from dbo.[table] order by id». Он подается на вход данного метода:
public void BindData(string command)
{
conn.Close();
ds = new DataSet();
cmd = new SqlCommand(command, conn);
da = new SqlDataAdapter(cmd);
da.Fill(ds);
try
{
conn.Open();
cmd.ExecuteNonQuery();
ScriptsGridView.DataSource = ds;
ScriptsGridView.DataBind();
conn.Close();
}
finally
{
conn.Close();
}
}
Для добавления записи в базу данных необходимо использовать следующий код, где query — обычный insert-запрос с подстановкой переменных:
Метод UploadFileToDB(), отвечающий за загрузку файла с базу данных, берет файл из элемента FileUpload, переводит его из входного потока в массив байтов с помощью BinaryReader и возвращает этот массив. Метод выглядит следующим образом:
using (Stream fs = fileupload1.PostedFile.InputStream)
{
using (BinaryReader br = new BinaryReader(fs))
{
byte[] bytes = br.ReadBytes((int)fs.Length);
return bytes;
}
}
Для того, чтобы вывести на интерфейс приложения текст файла, хранящегося в базе данных, необходимо перевести его обратно в читаемый вид. Для этого воспользуемся SQL-запросом, который получит бинарное представление файла из таблицы, а затем переведем в текст и отобразим. Открытие файла будет происходить при нажатии кнопки, расположенной в таблице рядом с файлом. Текст будет выводиться в ранее созданное окно.
int index = Convert.ToInt32(e.CommandArgument);
TableCellCollection lineCells = ScriptsGridView.Rows[index].Cells;
string id = lineCells[0].Text;
SqlCommand cmd = new SqlCommand(string.Format("select [script] from [table] where [script] is not null and [id] = {0} order by id desc", id), conn);
SqlDataAdapter adap = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adap.Fill(ds);
DataRow row = ds.Tables[0].Rows[0];
byte[] data = (byte[])row[0];
scriptTB.Text = Encoding.UTF8.GetString(data);
Поиск среди добавленных файлов будет работать на основе простого SQL-запроса (select * from [table] where [description] like ‘%{0}%’or [name] like ‘%{0}%’… ) и будет искать информацию по всем свойствам файла, которые мы указали при добавлении. Метод поиска выглядит следующим образом:
protected void SearchButton_Click(object sender, EventArgs e)
{
string searchTemplate = SearchTB.Text.Trim();
string searchQuery = string.Format("select * from [table] where [description] like '%{0}%' or [name] like '%{0}%' or executor like '%{0}%' order by [id] desc", searchTemplate);
BindData(searchQuery);
}
Помимо всего этого, можно реализовать не столь нужные, но удобные вещи, которые еще больше облегчат работу или исключат некоторые возможные ошибки в работе веб-приложения. Среди них:
Код данных фишек представлен ниже в порядке их упоминания (Методы 1-4 вызываются каждый раз при нажатии кнопки «Добавить» и связаны между собой вызовами):
string empty = string.Empty;
if (DescriptionTB.Text.Equals(empty) || DateTB.Text.Equals(empty) ||
{
HighlightEmptyInputs(textBoxes);
return "Не все поля заполнены.";
}
protected void HighlightEmptyInputs(TextBox[] textBoxes)
{
foreach (TextBox t in textBoxes)
{
if (t.Text.Equals(string.Empty))
{
t.BorderColor = Color.Red;
t.BorderWidth = 2;
}
}
if (!fileupload1.HasFile)
fileupload1.BorderColor = Color.Red;
}