我需要从数据库中检索图像并将其保存到磁盘。在数据库中,图像以二进制格式存储,但列的数据类型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 数据库上
请帮我解决这个问题
你提到你把二进制图像存储在一个varchar列中。这一点以及它适用于其他数据库技术的事实使您在Netazza案例中读取不同的数据变得不祥。
我建议设置一个测试项目,将相同的图像保存到 2 个不同的数据库(netazza 和 mssql),从两个数据库读回它,在 db 结果之间或原始结果和从数据库读取之间对结果进行按位比较。
如果您得到相同的结果,我会感到惊讶,如果我是对的,您应该考虑使用二进制数据类型将图像数据持久保存在数据库后端中。