将二进制图像从数据库保存到文件夹时出错
Posted
技术标签:
【中文标题】将二进制图像从数据库保存到文件夹时出错【英文标题】:Error while saving binary image from database to folder 【发布时间】:2012-11-28 19:42:32 【问题描述】:我需要从数据库中检索图像并将其保存到磁盘。在数据库中,图像以二进制格式存储,但列的数据类型为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 数据库中
请帮我解决这个问题
【问题讨论】:
删除你的try ... catch
子句,它隐藏了错误。
【参考方案1】:
您提到您将二进制图像存储在 varchar 列中。这一点以及它适用于其他数据库技术的事实使得您在 Netazza 案例中读取不同的数据是令人讨厌的。
我建议设置一个测试项目,在其中将相同的图像保存到 2 个不同的数据库(netazza 和 mssql),从两者中读取它,然后在 db 结果之间或原始和读取之间对结果进行按位比较来自分贝。
如果您得到相同的结果,我会感到惊讶,如果我是对的,您应该考虑使用二进制数据类型将图像数据持久保存在您的数据库后端。
【讨论】:
同意 - 你应该以二进制形式保存它们。无论如何,图像往往会占用大量空间,并且通过对它们进行 base64 编码,这样您就可以将它们放在 varchar 列中,您将每个大小添加 1/3。以上是关于将二进制图像从数据库保存到文件夹时出错的主要内容,如果未能解决你的问题,请参考以下文章
将 UIImage 作为二进制数据保存到 CoreData 实体时出错