C# 将图像保存到数据库(不工作)
C# Saving Image to database (Not working)
我正在尝试将歌曲的封面保存到具有行类型图像的数据库中。
目前它没有将我在此查询中填写的任何内容保存到数据库中,但我的其他查询工作正常。
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 张图片。
将参数声明为 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 代表 "up to 2 gigabytes of binary data"。您可以在图像类型参数中存储 MP3、Word 文档等
您也应该考虑参数化其他变量,同时...
编辑:注意评论中链接的资源,并考虑完全不将此数据存储在二进制列中
见下面的代码。我希望它能有所帮助-(我只添加了将图像保存在数据库中的代码)
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();
我正在尝试将歌曲的封面保存到具有行类型图像的数据库中。 目前它没有将我在此查询中填写的任何内容保存到数据库中,但我的其他查询工作正常。
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 张图片。
将参数声明为 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 代表 "up to 2 gigabytes of binary data"。您可以在图像类型参数中存储 MP3、Word 文档等
您也应该考虑参数化其他变量,同时...
编辑:注意评论中链接的资源,并考虑完全不将此数据存储在二进制列中
见下面的代码。我希望它能有所帮助-(我只添加了将图像保存在数据库中的代码)
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();