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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка и выгрузка файла из базы, Проблема с выгрузкой файла 
V
    Опции темы
Krayshon
Дата 14.7.2015, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Имеется база в которой хранятся 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. Не могу понят где ошибка, надеюсь кто-нибудь поможет.
PM MAIL   Вверх
Экскалупатор
Дата 14.7.2015, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



Код

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);


Это сообщение отредактировал(а) Экскалупатор - 14.7.2015, 12:18
PM MAIL ICQ   Вверх
Krayshon
Дата 14.7.2015, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Экскалупатор @ 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
PM MAIL   Вверх
Экскалупатор
Дата 14.7.2015, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



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

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

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

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


а имя в каком поле содержится? тоже в PDF? чет я сомневаюсь.
Вот и получается, что ты хочешь достать PDF по имени, но при этом в запросе имя сравниваешь с бинарным полем PDF
PM MAIL ICQ   Вверх
Krayshon
Дата 15.7.2015, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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


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

У меня не хранится имя, предлагаете добавить поле или можно работать и с этими данными?
PM MAIL   Вверх
Экскалупатор
Дата 15.7.2015, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



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

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

Так что вам нужно либо изменить запрос, к примеру искать по имени или ключу или еще какому то атрибуту, и если для этого придется изменить структуру таблицы, то да, надо изменить структуру таблицы(добавить нужные поля, заполнять их данными и пр.). Ну или все же использовать ваш запрос правильно и всегда искать PDF передавая весь искомый PDF(хз как подчеркнуть то, что это бред, но дело ваше.)
PM MAIL ICQ   Вверх
Krayshon
Дата 15.7.2015, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос решен, тему можно закрыть

Добавлено через 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(хз как подчеркнуть то, что это бред, но дело ваше.)

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

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

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

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


 




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


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

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