将二进制映像从数据库保存到文件夹时出错

时间:2012-11-28 19:42:32

标签: c# sql-server image save netezza

我需要从数据库中检索图像并将其保存到磁盘。在数据库中,图像以二进制格式存储,但列的数据类型为varchar(5000)

这是我用于检索图像并将其保存到磁盘的代码

public void CreateImageDataUsingDataReader_ForNetezzaDB()
{
        string strDbConn = string.Empty;
        string strImageFileName = string.Empty;
        string strImageData = string.Empty;
        string strImgSavePath = string.Empty;
        string strQuery = string.Empty;

        Byte[] byteImageData;
        MemoryStream stmImageData = new MemoryStream();
        Image saveImage;

        try
        {
            //---open the database connection
            strDbConn = ConfigurationSettings.AppSettings["NetezzaDBConnection"].ToString().Trim();
            OleDbConnection dbcon = new OleDbConnection(strDbConn);
            dbcon.Open();
            strQuery = "select name,signature_vod__c from sfb_call2_vod where signature_vod__c is not null  limit 10";
            OleDbCommand cmdSelect = new OleDbCommand(strQuery, dbcon);
            OleDbDataReader imageReader = cmdSelect.ExecuteReader();

            if (imageReader.HasRows)
            {
                while (imageReader.Read())
                {
                    strImageFileName = imageReader["name"].ToString().Trim();
                    strImageData = imageReader["signature_vod__c"].ToString().Trim();

                    stmImageData.Seek(0, SeekOrigin.Begin);
                    //converting string to byte array
                    byteImageData = Convert.FromBase64String(strImageData);
                    //---create Memory stremm from the Image Byte data                        
                    stmImageData.Write(byteImageData, 0, byteImageData.Length);
                    //--saving the image
                    //saveImage = Image.FromStream(stmImageData);
                    using (saveImage = Image.FromStream(stmImageData))
                    {
                        strImgSavePath = ConfigurationSettings.AppSettings["ImageSavePath"].ToString().Trim();
                        saveImage.Save(strImgSavePath + strImageFileName + ".png", System.Drawing.Imaging.ImageFormat.Png);   ///---error comes in this line                           
                    }
                }
            }
            imageReader.Close();
            dbcon.Close();
            stmImageData.Close();
            stmImageData = null;
        }
        catch (Exception ex)
        {
            throw new Exception("Error Occured in method CreateImageDataUsingDataReader " + ex.Message);
        }
}

但我一直收到错误:

  

GDI +中发生了一般性错误。

相同的代码,如果我执行SQL Server数据库它工作正常但问题只来自Netezza数据库

请帮我解决此问题

1 个答案:

答案 0 :(得分:0)

您提到将二进制映像存储在varchar列中。这个以及它在其他数据库技术上工作的事实使得您在Netazza案例中阅读不同的数据是显而易见的。

我建议设置一个testproject,你将相同的图像保存到2个不同的数据库(netazza和mssql),从db结果之间或者原始和读取之间的结果进行逐位比较读取它来自db。

如果你得到相同的结果我会感到惊讶,如果我是对的,你应该考虑使用二进制数据类型来保存数据库后端中的图像数据。