如何从SQL Server获取图像数据,写入文件,使用C#将文件保存到磁盘

时间:2014-07-31 15:49:48

标签: c# sql sql-server

我正在尝试从SQL Server数据库中获取存储为Image数据类型的附件(图像,word文档等)。附件可以是任何文件类型,但我只是想成功下载.jpg。

我可以将文件保存到本地驱动器,但在此过程中似乎正在破坏文件。

我正在尝试做什么:

  1. 从SQL Server数据库中检索IMAGE类型的二进制数据。
  2. 从二进制数据创建文件。
  3. 将文件保存到本地目录。
  4. 我的代码:

        public void ProcessRequest()
        {
            //Get the ticket number from query string
            _ticketNumber = context.Request.QueryString["ID"];
    
            SqlConnection conn = new SqlConnection(_DBConn);
            SqlCommand cmd = new SqlCommand();
            string fileName = ""; //Holds the file name retrieved from DB
            byte[] data; // Holds the IMAGE data from DB
    
            using (conn)
            {
                using (cmd)
                {
    
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = @"SELECT File_Name, Data FROM Tickets_All INNER JOIN Attachments ON Tickets_All.ID = Attachments.[Object_ID] WHERE Ticket = @Ticket";
                    cmd.Parameters.AddWithValue("@Ticket", _ticketNumber);
                    cmd.Connection = conn;
                    conn.Open();
    
                    SqlDataReader reader = cmd.ExecuteReader();
    
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            fileName = reader.GetString(0);
                            data = (byte[])reader["Data"];
    
                            if (data != null)
                            {
                                SaveData(fileName, data);
                            }
                        }
                    }
    
                    reader.Close();
    
                }
            }
    
        protected bool SaveData(string FileName, byte[] Data)
        {
            string path = @"C:\Windows\temp\test.jpg";
    
            try
            {
                BinaryWriter writer = new BinaryWriter(File.OpenWrite(path));
                writer.Write(Data);
                writer.Flush();
                writer.Close();
            }
            catch (Exception ex)
            {
                return false;
            }
    
            return true;
        }
    

    请原谅我,如果代码不符合最佳实践,我更多的是VB程序员,我以前从来没有这样做过。我只想尝试一个有效的例子。

    提前致谢。

2 个答案:

答案 0 :(得分:2)

我会使用Image.FromStream方法执行此操作: http://msdn.microsoft.com/en-us/library/system.drawing.image.fromstream(v=vs.110).aspx

protected bool SaveData(string FileName, byte[] Data)
{
    using (Image image = Image.FromStream(new MemoryStream(Data)))
    {
        image.Save("MyImage.jpg", ImageFormat.Jpeg);
    }

    return true;
}

答案 1 :(得分:0)

感谢大家的投入。在做了一些额外的测试之后,我认为从数据库中检索的数据已经以某种方式被压缩了。我能够以编程方式插入和拔出文件,当应用程序将数据放入数据库(第三方软件)时,问题就出现了。我将调查一下我可以提出的压缩。