如何实现将图像存储至postgre数据库(特急)

cityhunter_bj 2012-06-11 08:28:56
折腾了3天了还是没有将图像存储至postgre数据库中.从网上查询说将数据库字段设置为bytea类型,通过AppendChunk函数实现,但是执行时报"此环境中不允许操作".代码如下
FILE *file;
long m_iSize;
char *lpBuffer=NULL, *lpTemp;
VARIANT varBLOB;
CString m_strSQL;
SAFEARRAY *safeArray;
SAFEARRAYBOUND safeArrayB[1];
int m_iResult=0;

//读取文件流
file = fopen( filename, "rb+");
if(!file) {
return -1; //无法打开文件
}
fseek(file,0,2); //定位最后一行
m_iSize = ftell(file); //获取文件大小
fseek( file, 0, 0); //定位首行
lpBuffer = new char[m_iSize]; //申请空间在调用处负责释放
memset(lpBuffer, 0, sizeof(lpBuffer));
fread(lpBuffer, sizeof(char), m_iSize, file);
fclose(file);

//写入内存块
if(lpBuffer)
{
lpTemp = lpBuffer;
safeArrayB[0].lLbound = 0;
safeArrayB[0].cElements = m_iSize;
safeArray = SafeArrayCreate(VT_UI1, 1, safeArrayB); //创建SAFEARRAY对象
for (long i = 0; i < (long)m_iSize; i++)
{
SafeArrayPutElement (safeArray, &i, lpTemp++); //将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
}
varBLOB.vt = VT_ARRAY|VT_UI1; //将varBLOB的类型设置为BYTE类型的数组
varBLOB.parray = safeArray; //为varBLOB变量赋值

//写入数据
try
{
m_dbUpdate->CursorType=adOpenDynamic;
m_dbUpdate->Open(_bstr_t("select * from his_image "), _variant_t((IDispatch*)m_dbConnect,true), adOpenDynamic, adLockOptimistic, adCmdText);
m_dbUpdate->AddNew(); //添加新记录
m_dbUpdate->Fields->GetItem("image_id")->PutValue((_variant_t)image_id ); //为新记录填充username字段
m_dbUpdate->Fields->GetItem("image_date")->PutValue( (_variant_t)date ); //填充old字段
m_dbUpdate->Fields->GetItem("image_data")->AppendChunk( varBLOB);//一执行就报错 //加入BLOB类型的数据
m_dbUpdate->Update();
m_dbUpdate->Close();
m_iResult=0;
}catch(_com_error &e)
{
AfxMessageBox(e.Description());
m_iResult= -1;
}
delete[] lpBuffer;
}

return m_iResult;
...全文
386 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
悄然99 2014-01-13
  • 打赏
  • 举报
回复
你好!我也遇到这个问题了。可以给我说说你是怎么解决的吗?
cityhunter_bj 2012-06-13
  • 打赏
  • 举报
回复
具体代码如下
bool SaveImage(char *filename, int image_id, char *date)
{
long m_lSize;
CString m_strSQL;
bool m_iResult=false;

//读取文件流
_StreamPtr pStream(__uuidof(Stream));
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
pStream->Type=adTypeBinary;
pStream->raw_Open(varOptional, adModeUnknown, adOpenStreamUnspecified, NULL, NULL);
pStream->LoadFromFile(filename);
m_lSize= pStream->GetSize();
if(m_lSize>0)
{
try
{
m_dbUpdate->Open(_bstr_t("select * from his_image where 1=0"), _variant_t((IDispatch*)m_dbConnect,true), adOpenStatic, adLockOptimistic, adCmdText);

m_dbUpdate->AddNew(); //添加新记录
m_dbUpdate->Fields->GetItem("image_id")->PutValue((_variant_t)image_id ); //为新记录填充username字段
m_dbUpdate->Fields->GetItem("image_date")->PutValue( (_variant_t)date ); //填充old字段
m_dbUpdate->Fields->GetItem("image_data")->AppendChunk( pStream->Read(m_lSize) );
m_dbUpdate->Update();
m_dbUpdate->Close();
m_iResult=true;
}catch(_com_error &e)
{
AfxMessageBox(e.Description());
m_iResult= false;
}
}

return m_iResult;

}
cityhunter_bj 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
http://topic.csdn.net/t/20060712/19/4876469.html
[/Quote]

这种方法插入8000bit以下的没有问题,但是大于8000多以后就报写入错误了.
zyq5945 2012-06-11
  • 打赏
  • 举报
回复
用这个ADO类试试。
cityhunter_bj 2012-06-11
  • 打赏
  • 举报
回复
跪求高手相助!
cityhunter_bj 2012-06-11
  • 打赏
  • 举报
回复
还是提示“此环境中不允许操作”
是我的数据库有问题还是ADO版本低,还是数据类型设置有问题还是?????
望高手指点
万分感激!!!

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧