0

我需要从数据库中检索图像并将其保存到磁盘。在数据库中,图像以二进制格式存储,但列的数据类型为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 数据库中

请帮我解决这个问题

4

1 回答 1

0

您提到您将二进制图像存储在 varchar 列中。这一点以及它在其他数据库技术上工作的事实使得您在 Netazza 案例中读取不同的数据是很讨厌的。

我建议设置一个测试项目,在其中将相同的图像保存到 2 个不同的数据库(netazza 和 mssql),从两者中读取它,然后对 db 结果之间或原始结果与从 db 读取的结果进行按位比较。

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

于 2012-11-28T19:54:00.247 回答