C#将图像保存到数据库(不起作用)

时间:2018-12-17 16:51:46

标签: c# sql database image memorystream

我正在尝试将歌曲的封面保存到具有行类型图像的数据库中。 目前它没有保存任何内容,我将这个查询填充到数据库中,但其他查询运行正常。

 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张图像。

2 个答案:

答案 0 :(得分:1)

声明参数为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 GB的二进制数据”。您可以在图像类型参数中存储MP3,Word文档等

在使用它时,您也应该考虑对其他变量进行参数化...

编辑:请注意注释中链接的资源,并考虑完全不将数据存储在二进制列中

答案 1 :(得分:0)

请参见以下代码。我希望它会有所帮助-(我仅添加了将图像保存在DB中的代码)

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