Я пытаюсь сохранить кавер на песню в базу данных с изображением типа строки. В настоящее время он не сохраняет ничего, что я заполняю в этом запросе в базе данных, но другие мои запросы работают нормально.
public void AddSong(string names, string artists, string bands, string album, string strFilePath, string strlyrics, string strmp3)
{
if (strFilePath != null)
{
Image temp = new Bitmap(strFilePath);
MemoryStream strm = new MemoryStream();
temp.Save(strm, System.Drawing.Imaging.ImageFormat.Jpeg);
ImageByteArray = strm.ToArray();
}
SqlConnection con = new SqlConnection(ConnectionString);
//SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Ruben\Documents\dbPlatenCompany.mdf;Integrated Security = True; Connect Timeout = 30");
string query = "INSERT INTO [tblSongs] ([Name], [Artist], [Band], [Album], [Cover], [lyrics], [mp3]) VALUES ('" + names + "','" + artists + "','" + bands + "','" + album + "', @IMG,'" + strlyrics + "','" + strmp3 + "')";
SqlCommand cmd = new SqlCommand(query, con);
try
{
con.Open();
cmd.Parameters.Add(new SqlParameter("@IMG", ImageByteArray));
cmd.BeginExecuteNonQuery();
MessageBox.Show("gelukt");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Обновлено: Я понимаю, что хранение изображения в базе данных, вероятно, не лучший способ сделать это. Но это небольшой школьный проект, поэтому в нем будет всего около 4 изображений.
Хранить изображения в базе данных - не лучшая идея. Вместо этого загрузите изображение и сохраните URL-адрес или расположение файла изображения.
Как говорили другие, хранение изображений - это не очень хорошо, потому что это может занять много места в базе данных, а базы данных на самом деле не предназначены для хранения огромных типов данных, подобных этому. Лучшее, что вы могли сделать, это просто сохранить путь к изображению, а затем отобразить его с этого пути (вы, конечно, сначала должны загрузить его на сервер)
Попробуйте использовать ExecuteNonQuery
вместо BeginExecuteNonQuery
. Если вам нужна асинхронная обработка, вы также должны использовать EndExecuteNonQuery
или лучше использовать более новую версию на основе задач ExecuteNonQueryAsync
.
Это + + не + было + + правильным + способом + составления + SQL в течение очень долгого времени. Это утомительно, трудно читать и очень подвержено ошибкам. Всегда используйте параметры SQL
Попробуйте: c-sharpcorner.com/UploadFile/e628d9/…
Объявите параметр, имеющий тип Image или VarBinary и длину, достаточную для его хранения. Вы также можете попробовать объявить длину параметра равной 0 ..
cmd.Parameters.Add("@IMG", SqlDbType.Image, ImageByteArray.Length).Value = ImageByteArray);
cmd.Parameters.Add("@IMG", SqlDbType.VarBinary, ImageByteArray.Length).Value = ImageByteArray);
Обратите внимание, что SqlDbType.Image не имеет ничего общего с данными изображения (png, jpeg и т. д.) - это SQLServer означает «до 2 гигабайт двоичных данных». Вы можете сохранить файл MP3, Word и т. д. В параметре типа изображения.
Вам следует подумать о параметризации и других переменных, пока вы занимаетесь этим ...
Обновлено: обратите внимание на ресурс, связанный в комментарии, и рассмотрите возможность НЕ хранить эти данные в двоичном столбце вообще
Тип данных изображения также устарел, см. stackoverflow.com/questions/444072/…. И SqlConnection может находиться в используемом блоке (для своевременного удаления).
Большое спасибо, я плохо разбираюсь в этом, я новичок в работе с базами данных. Но, похоже, это не решает проблему для меня.
См. Код ниже. Я надеюсь, что это поможет - (я только добавил код для сохранения изображения в БД)
FileStream fs = new FileStream(selectedFile, FileMode.Open, FileAccess.Read);
byte[] bimage = new byte[fs.Length];
fs.Read(bimage, 0, Convert.ToInt32(fs.Length));
SqlConnection cn;
cn = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Integrated
Security=True");
cn.Open();
SqlCommand cmd = new SqlCommand("insert into MyTable (Image)
values(@imgdata)", cn);
cmd.Parameters.AddWithValue("@imgdata", SqlDbType.Image).Value = bimage;
cmd.ExecuteNonQuery();
cn.Close();
Кстати, у вас есть уязвимость SQL-инъекции. Чтобы этого избежать, используйте параметры SQL.