【问题标题】:C# Saving Image to database (Not working)C#将图像保存到数据库(不工作)
【发布时间】:2018-12-17 16:51:46
【问题描述】:

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

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

【问题讨论】:

  • 顺便说一句,你那里有一个 SQL 注入漏洞。使用 SQL 参数来避免它。
  • 将图像存储到数据库中不是一个好主意。改为上传图片并保存图片的 URL 或文件位置
  • 就像其他人说的那样,存储图像并不好,因为它会占用大量的数据库存储空间,而数据库并不是真正用于存储这种庞大的数据类型。您能做的最好的就是存储图片路径,然后从该路径显示它(当然,您必须先将其上传到服务器上)
  • 尝试使用ExecuteNonQuery 而不是BeginExecuteNonQuery。如果您需要异步处理,您还应该使用EndExecuteNonQuery 或更好地使用更新的基于任务的版本ExecuteNonQueryAsync
  • 那个+有+没+过+那个+对+方式+写SQL很久了。它很乏味,难以阅读并且很容易出错。始终使用 SQL 参数

标签: c# sql database image memorystream


【解决方案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 文档等

您也应该考虑参数化其他变量,而您正在使用它...

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

【讨论】:

  • 图像数据类型也已被弃用,请参阅stackoverflow.com/questions/444072/…。并且 SqlConnection 可以在 using 块中(用于及时处理)。
  • 非常感谢我对使用数据库的新手非常感谢。但这似乎并不能解决我的问题。
【解决方案2】:

见下面的代码。我希望它会有所帮助-(我只添加了将图像保存在数据库中的代码)

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

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多