Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Загрузка и выгрузка файла из базы


Автор: Krayshon 14.7.2015, 12:08
Имеется база в которой хранятся pdf и txt файлы, а так же данные об этих файлах.
Для реализации используется SQL Server 2008 и Visual Studio 2010 на языке C#.
Для начала были созданы классы для загрузки и выгрузки файлов
Код

public static void AddFileToBase(string fileName, byte[] PDF)
             {

                 string insertCMD = "INSERT INTO Items VALUES(@PDF)";
                 using (SqlConnection cnn = new SqlConnection("Data Source=КАРПЕНКО_Е;Initial Catalog=DB;Integrated Security=True"))
                 {
                     cnn.Open();
                     using (SqlCommand cmd = new SqlCommand(insertCMD, cnn))
                     {
                         SqlParameter paramData = new SqlParameter("@PDF", DbType.Binary);
                         paramData.Value = PDF;
                         cmd.Parameters.AddRange(new[] { paramData });
                         cmd.ExecuteNonQuery();
                     }
                 }
             }

Код

public static byte[] GetDataFromBase(string pDFLabel2)
             {
                 string selectCMD = string.Format("SELECT PDF FROM Literatura WHERE PDF='{0}'", pDFLabel2);
                 using (SqlConnection cnn = new SqlConnection("Data Source=КАРПЕНКО_Е;Initial Catalog=DB;Integrated Security=True"))
                 {
                     cnn.Open();
                     using (SqlCommand cmd = new SqlCommand(selectCMD, cnn))
                     {
                         using (SqlDataReader dr = cmd.ExecuteReader())
                         {
                             if (!dr.HasRows)
                             {
                                 throw new ArgumentException("DATA NOT EXISTS!");
                             }
                             dr.Read();
                             byte[] data = (byte[])dr["PDF"];
                             return data;
                         }
                     }
                 }
             }


Далее часть кода с загрузкой файла в базу
Код

 var filename = pDFLabel2.Text;
             byte[] fileContents;
              if (TryReadFile(filename, out fileContents))
                 {
                  cmd.Parameters.AddWithValue("@PDF", fileContents);
                 } 
             else
                 {
                  MessageBox.Show("Error");
                 }


Ну и попытка его скачать
Код

string name = litDataGridView.SelectedRows[0].Cells[13].Value.ToString();
            byte[] data = DBTest.GetDataFromBase(name);

            using (SaveFileDialog dialog = new SaveFileDialog() { FileName = name })
            {
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    File.WriteAllBytes(dialog.FileName, data);
                }
            }


Все работает до последнего шага. При попытке скачать вылетает "DATA NOT EXISTS!" прописанные в GetDataFromBase. Не могу понят где ошибка, надеюсь кто-нибудь поможет.

Автор: Экскалупатор 14.7.2015, 12:16
Код

string selectCMD = string.Format("SELECT PDF FROM Literatura WHERE PDF='{0}'", pDFLabel2);

судя по этому запросы мы хотим достать PDF из таблицы Literatura, где PDF = ... чему?
PDF это бинарное поле и для того что бы этот запрос сработал нужно туда забить все содержимое искомого PDF, что само по себе весьма странно.
Измените запрос на выборку по какому либо ключу, или по имени. но не по СОДЕРЖИМОМУ файла.

К тому же пытаетесь вы его скачивать именно по имени, но это имя в запросе используете для поиска в ТЕЛЕ PDF, т.е. в вашем бинароном поле.

должно быть что-то вроде:

string selectCMD = string.Format("SELECT PDF FROM Literatura WHERE Name='{0}'", pDFLabel2);

Автор: Krayshon 14.7.2015, 13:35
Цитата(Экскалупатор @ 14.7.2015,  12:16)
Код

string selectCMD = string.Format("SELECT PDF FROM Literatura WHERE PDF='{0}'", pDFLabel2);

судя по этому запросы мы хотим достать PDF из таблицы Literatura, где PDF = ... чему?
PDF это бинарное поле и для того что бы этот запрос сработал нужно туда забить все содержимое искомого PDF, что само по себе весьма странно.
Измените запрос на выборку по какому либо ключу, или по имени. но не по СОДЕРЖИМОМУ файла.

К тому же пытаетесь вы его скачивать именно по имени, но это имя в запросе используете для поиска в ТЕЛЕ PDF, т.е. в вашем бинароном поле.

должно быть что-то вроде:

string selectCMD = string.Format("SELECT PDF FROM Literatura WHERE Name='{0}'", pDFLabel2);

Имя поля в котором содержатся байты называется PDF

Автор: Экскалупатор 14.7.2015, 22:01
Цитата(Krayshon @  14.7.2015,  12:35 Найти цитируемый пост)
Имя поля в котором содержатся байты называется PDF 

да именно это я и написал!

Но ты пытаешься получить данные не по содержимому файла, а по ИМЕНИ:
Код

byte[] data = DBTest.GetDataFromBase(name);


а имя в каком поле содержится? тоже в PDF? чет я сомневаюсь.
Вот и получается, что ты хочешь достать PDF по имени, но при этом в запросе имя сравниваешь с бинарным полем PDF

Автор: Krayshon 15.7.2015, 09:00
Цитата(Экскалупатор @ 14.7.2015,  22:01)
Цитата(Krayshon @  14.7.2015,  12:35 Найти цитируемый пост)
Имя поля в котором содержатся байты называется PDF 

да именно это я и написал!

Но ты пытаешься получить данные не по содержимому файла, а по ИМЕНИ:
Код

byte[] data = DBTest.GetDataFromBase(name);


а имя в каком поле содержится? тоже в PDF? чет я сомневаюсь.
Вот и получается, что ты хочешь достать PDF по имени, но при этом в запросе имя сравниваешь с бинарным полем PDF

У меня не хранится имя, предлагаете добавить поле или можно работать и с этими данными?

Автор: Экскалупатор 15.7.2015, 10:35
Цитата(Krayshon @  15.7.2015,  08:00 Найти цитируемый пост)
У меня не хранится имя, предлагаете добавить поле или можно работать и с этими данными? 

предлагаю для начала ознакомится с тем, как работают SQL-запросы. проблема в том, что вы пытаетесь искать в базе PDF, по содержимому этого же PDF, что бы ваш запрос сработал, нужно передать в него в качестве параметра, ВСЕ СОДЕРЖИМОЕ ИСКОМОГО ФАЙЛА. Иными словами, если у нас есть PDF размером 10MB, то для правильного срабатывания вашего SQL-запроса, в него, в выражение 'WHERE PDF = ', нужно передать все эти 10MB. Очевидно, что вы этого не делаете, и отсюда получается что скрипт не работает. Я вам предлагаю искать PDF не по его содержимому, а по каким-то его атрибутам, по id в базе к примеру, или имени или еще чему то.
... Ну или передавать ВСЕГДА ВСЕ тело(содержимое) файла. Правда это похоже на бред в данном случае, потому что вы пытаетесь поднять из базы PDF, передавая в качестве аргумента этот же PDF, спрашивается, нафига вообще делать запрос, если у вас уже есть что вы хотите получить.

Так что вам нужно либо изменить запрос, к примеру искать по имени или ключу или еще какому то атрибуту, и если для этого придется изменить структуру таблицы, то да, надо изменить структуру таблицы(добавить нужные поля, заполнять их данными и пр.). Ну или все же использовать ваш запрос правильно и всегда искать PDF передавая весь искомый PDF(хз как подчеркнуть то, что это бред, но дело ваше.)

Автор: Krayshon 15.7.2015, 10:39
Вопрос решен, тему можно закрыть

Добавлено через 2 минуты и 4 секунды
Цитата(Экскалупатор @ 15.7.2015,  10:35)
Цитата(Krayshon @  15.7.2015,  08:00 Найти цитируемый пост)
У меня не хранится имя, предлагаете добавить поле или можно работать и с этими данными? 

предлагаю для начала ознакомится с тем, как работают SQL-запросы. проблема в том, что вы пытаетесь искать в базе PDF, по содержимому этого же PDF, что бы ваш запрос сработал, нужно передать в него в качестве параметра, ВСЕ СОДЕРЖИМОЕ ИСКОМОГО ФАЙЛА. Иными словами, если у нас есть PDF размером 10MB, то для правильного срабатывания вашего SQL-запроса, в него, в выражение 'WHERE PDF = ', нужно передать все эти 10MB. Очевидно, что вы этого не делаете, и отсюда получается что скрипт не работает. Я вам предлагаю искать PDF не по его содержимому, а по каким-то его атрибутам, по id в базе к примеру, или имени или еще чему то.
... Ну или передавать ВСЕГДА ВСЕ тело(содержимое) файла. Правда это похоже на бред в данном случае, потому что вы пытаетесь поднять из базы PDF, передавая в качестве аргумента этот же PDF, спрашивается, нафига вообще делать запрос, если у вас уже есть что вы хотите получить.

Так что вам нужно либо изменить запрос, к примеру искать по имени или ключу или еще какому то атрибуту, и если для этого придется изменить структуру таблицы, то да, надо изменить структуру таблицы(добавить нужные поля, заполнять их данными и пр.). Ну или все же использовать ваш запрос правильно и всегда искать PDF передавая весь искомый PDF(хз как подчеркнуть то, что это бред, но дело ваше.)

Спасибо за ответ, сделал практически все так как Вы и написали.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)