MuhammadNaamh Ответов: 1

Загрузить фотографию в базу данных C#


Привет всем я использую код для загрузки фотографии в базу данных :

// Read the file and convert it to Byte Array
       string filepath = upload_image.PostedFile.FileName;
       string filename = Path.GetFileName(filepath);
       string ext = Path.GetExtension(filename);
       string contenttype = string.Empty;

       switch (ext){
           case ".doc":
               contenttype = "application/vnd.ms-word";
               break;
           case ".docx":
               contenttype = "application/vnd.ms-word";
               break;
           case ".xls":
               contenttype = "application/vnd.ms-excel";
               break;
           case ".xlsx":
               contenttype = "application/vnd.ms-excel";
               break;
           case ".jpg":
               contenttype = "image/jpg";
               break;
           case ".png":
               contenttype = "image/png";
               break;
           case ".gif":
               contenttype = "image/gif";
               break;
           case ".pdf":
               contenttype = "application/pdf";
               break;
       }
       if (contenttype != String.Empty)
       {
           Stream fs = upload_image.PostedFile.InputStream;
           BinaryReader br = new BinaryReader(fs);
           Byte[] bytes = br.ReadBytes((Int32)fs.Length);
           SqlConnection conn = new SqlConnection("Data Source=DESKTOP-06QKCFT\\SQLEXPRESS;Initial Catalog=CMS1;Integrated Security=True");
           conn.Open();

           string insert_query = "INSERT INTO [image] ([name], [contenttype], [data]) VALUES (@name, @contenttype, @data)";
           SqlCommand cmd = new SqlCommand(insert_query, conn);

           cmd.Parameters.AddWithValue("@name", SqlDbType.VarChar).Value = filename;
           cmd.Parameters.AddWithValue("@contenttype", SqlDbType.VarChar).Value = contenttype;
           cmd.Parameters.AddWithValue("@data", SqlDbType.VarChar).Value = bytes;
           cmd.ExecuteNonQuery();
           Lb1.ForeColor = System.Drawing.Color.Green;
           Lb1.Text = "File Uploaded Successfully";
           conn.Close();
       }
       else
       {
           Lb1.ForeColor = System.Drawing.Color.Red;
           Lb1.Text = "File format not recognised." +
         " Upload Image/Word/PDF/Excel formats";

       }

   }


Что я уже пробовал:

но когда я запустил его, он выдал мне эту ошибку: Ошибка в строке 66
Line 64:             cmd.Parameters.AddWithValue("@contenttype", SqlDbType.VarChar).Value = contenttype;
Line 65:             cmd.Parameters.AddWithValue("@data", SqlDbType.VarChar).Value = bytes;
Line 66:             cmd.ExecuteNonQuery();
Line 67:             Lb1.ForeColor = System.Drawing.Color.Green;
Line 68:             Lb1.Text = "File Uploaded Successfully";

CHill60

В чем же ошибка?

MuhammadNaamh

Строка 66: cmd.Метод executenonquery();

CHill60

Это не ошибка. Это строка кода.

Richard MacCutchan

Как, черт возьми, эти люди получают работу?

CHill60

Я знаю: вздох:

MuhammadNaamh

Я новичок в c#, а не профессионал, как вы #Ричард Маккатчан#

CHill60

Дружеский совет, если вам нужно задать больше вопросов: нам нужно будет знать формулировки сообщений об ошибках, которые будут показаны. Точная формулировка лучше всего подходит, и вы обычно можете использовать Ctrl-C, чтобы скопировать ее. Предоставление нам всей необходимой информации помогает нам помочь вам.

MuhammadNaamh

Я сделаю спасибо

Richard MacCutchan

Вы были членом здесь в течение 5 лет; вряд ли Новичок.

MuhammadNaamh

можете ли вы помочь дать решение сказать это иначе чем это спасибо за просмотр

Richard MacCutchan

Это не ошибка, это оператор C#.

1 Ответов

Рейтинг:
11

CHill60

Кажется, я только что заметил проблему...

cmd.Parameters.AddWithValue("@name", SqlDbType.VarChar).Value = filename;
cmd.Parameters.AddWithValue("@contenttype", SqlDbType.VarChar).Value = contenttype;
cmd.Parameters.AddWithValue("@data", SqlDbType.VarChar).Value = bytes;
Вы все перепутали Parameters.Add и Parameters.AddWithValue
Либо использовать
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = filename;
cmd.Parameters.Add("@contenttype", SqlDbType.VarChar).Value = contenttype;
cmd.Parameters.Add("@data", SqlDbType.VarChar).Value = bytes;
или даже лучше...
cmd.Parameters.AddWithValue("@name", filename);
cmd.Parameters.AddWithValue("@contenttype", contenttype);
cmd.Parameters.AddWithValue("@data", bytes);


MuhammadNaamh

спасибо, что сработала остановка ошибки:) но таблица в БД пуста !!!! сообщение показывает, что файл успешно загружен, но никаких данных!!!

CHill60

Вы можете проверить возвращаемое значение из cmd.ExecuteNonQuery() - это должно быть количество строк, на которые влияет запрос - в этом случае вы ожидаете, что оно будет равно 1.
Если нет никаких ошибок, вы уверены, что база данных, которую вы ищете для записи, является той же самой, что и соединение в коде? (Я уже делал это раньше, когда у меня были таблицы в двух разных базах данных с одинаковым именем, и я смотрел не на ту!)
Я предполагаю, что вы используете .NET Framework 2.0 или более позднюю версию? (т. е. не 1.0)
Единственное, что я могу придумать без сообщения об ошибке, чтобы помочь, - это то, что таблица не допускает нулей в одном из столбцов и что одно из ваших значений на самом деле равно нулю. Вы можете отладить, чтобы проверить это - см. Эту статью для получения помощи в этом Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

MuhammadNaamh

Я изменил свой путь :
частная логическое update_image(команда sqlcommand cmd в)
{
String strConnString = система.Конфигурация.Диспетчер конфигураций
. ConnectionStrings ["CMS1ConnectionString"].Параметр connectionString;
SqlConnection con = new SqlConnection(strConnString);
УМК.CommandType = CommandType. Text;
УМК.Подключение = кон;
пробовать
{
против.Открыть();
УМК.Метод executenonquery();
вернуть true;
}
поймать (исключение бывший)
{
Ответ.Запись (напр. сообщение);
возвращать false;
}
наконец
{
против.Закрывать();
против.Располагать();
}

}
охраняемых недействительными upload_Click(объект отправителя, EventArgs в электронной)
{
// Прочитайте файл и преобразуйте его в байтовый массив
строку путь к файлу = upload_image.PostedFile.имя файла;
строка файла = путь.GetFileName(путь_к_файлу);
строки ВН = путь.GetExtension(именем);
string contenttype = строка.Пустой;

переключатель (ext){
дело". док":
contenttype = " application/vnd. ms-word";
перерыв;
дело". docx":
contenttype = " application/vnd. ms-word";
перерыв;
дело". xls":
contenttype = " application/vnd. ms-excel";
перерыв;
чехол". xlsx":
contenttype = " application/vnd. ms-excel";
перерыв;
чехол ".в формате JPG":
contenttype = " изображение / jpg";
перерыв;
чехол ".ПНГ":
contenttype = " изображение / png";
перерыв;
чехол ".гиф":
contenttype = " изображение / gif";
перерыв;
дело". pdf":
contenttype = " приложение / pdf";
перерыв;
}
if (contenttype != String.Пустой)
{
Поток fs = upload_image.PostedFile.Входной поток;
BinaryReader br = новый BinaryReader(fs);
Байт[] байт = БР.ReadBytes((int32)для ФС.Длина);

// вставить файл в базу данных
строки insert_query = "вставить в [изображения] ([имя], [значение contentType], [данные]) значения (@имя, @значение contentType, @данные)";
SqlCommand cmd = new SqlCommand(insert_query);

УМК.Параметры.AddWithValue ("@name", filename);
УМК.Параметры.AddWithValue ("@contenttype", contenttype);
УМК.Параметры.AddWithValue ("@data", байты );
update_image(УМК);
LB1 в.Свойство Forecolor = Система.Рисование.Цвет.Зеленый;
LB1 в.Text = " Файл Успешно Загружен";

}
ещё
{
LB1 в.Свойство Forecolor = Система.Рисование.Цвет.Красный;
LB1 в.Text = "формат файла не распознан". +
"Загрузка форматов изображений / Word/PDF/Excel";

}

}
}
он показывает мне сообщение (строка или двоичные данные будут усечены. Заявление было прекращено.)
Файл Успешно Загружен

MuhammadNaamh

но и данных тоже нет :(

CHill60

Это означает, что одно из значений, которое вы пытаетесь вставить в таблицу, слишком велико для столбца. ... [Правка-удалены неправильные мысли. Огорченный].
Как вы объявили столбцы таблицы базы данных

MuhammadNaamh

да имя моей таблицы изображение :

идентификатор инт
имя варчар(255)
contenttype varchar(255)
данные varbinary(255)

CHill60

Это будет столбец Data varbinary(255) - столбец недостаточно велик для данных, которые вы пытаетесь вставить. Разве это не должно быть типичным image

MuhammadNaamh

Спасибо за ваше время, это сработало на 100%, что очень здорово знать такого человека, как вы

Richard Deeming

С Add версия, вам также нужно будет исправить тип @data параметр - SqlDbType.VarChar это не будет работать для двоичных данных. :)