表有3个字段
RKBH VARCHAR2 10
PHOTO BLOB
PHOTO1 BLOB用一段程序往这个表里面插入数据,代码如下:
pRS->AddNew();
pRS->GetFields()->GetItem(_T(""))->PutValue(_variant_t(_T("hello")));
pRS->GetFields()->GetItem(_T("PHOTO"))->AppendChunk(vaResult);
pRS->GetFields()->GetItem(_T("PHOTO1"))->AppendChunk(vaResult);
//vaResult保存的是二进制数据(经检查是有效的数据)
pRS->Update();
当PHOTO和PHOTO1字段的属性有一个不可以为空时,出现以下错误:
---ERR.Description:操作在该内容中不被允许。
---ERR.source:ADODB.Recordset
只有在PHOTO和PHOTO1字段都可以为空时,程序才运行正确这个是为什么呢?
RKBH VARCHAR2 10
PHOTO BLOB
PHOTO1 BLOB用一段程序往这个表里面插入数据,代码如下:
pRS->AddNew();
pRS->GetFields()->GetItem(_T(""))->PutValue(_variant_t(_T("hello")));
pRS->GetFields()->GetItem(_T("PHOTO"))->AppendChunk(vaResult);
pRS->GetFields()->GetItem(_T("PHOTO1"))->AppendChunk(vaResult);
//vaResult保存的是二进制数据(经检查是有效的数据)
pRS->Update();
当PHOTO和PHOTO1字段的属性有一个不可以为空时,出现以下错误:
---ERR.Description:操作在该内容中不被允许。
---ERR.source:ADODB.Recordset
只有在PHOTO和PHOTO1字段都可以为空时,程序才运行正确这个是为什么呢?
vaResult.vt=VT_ARRAY|VT_UI1
里面的数据是没问题的
BLOB数据的保存
BLOB类型的数据无法用普通的方式进行存储,我们需要使用AppendChunk函数,AppendChunk包含在Field对象中,原型如下:
HRESULT AppendChunk (const _variant_t & Data );
从函数原型中可以看到关键的问题是我们需把二进制数据赋值给VARIANT类型的变量,下面我们给出具体的代码并作简单的分析:
///假设m_pBMPBuffer指针指向一块长度为m_nFileLen的二进制数据,并且已经成功打开了记录集对象m_pRecordset///char *pBuf = m_pBMPBuffer;
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];m_pRecordset->AddNew(); ///添加新记录
m_pRecordset->PutCollect("username",_variant_t("小李")); ///为新记录填充username字段
m_pRecordset->PutCollect("old",_variant_t((long)28); ///填充old字段
if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_nFileLen;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象
for (long i = 0; i < (long)m_nFileLen; i++)
SafeArrayPutElement (psa, &i, pBuf++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组
varBLOB.parray = psa; ///为varBLOB变量赋值
m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varBLOB);///加入BLOB类型的数据
}
m_pRecordset->Update();
visual c++
oracle
ado
adLockOptimistic, adCmdTable);
rs->AddNew();
_variant_t var;
COleDateTime tDate;
m_datePic.GetTime(tDate);
var.vt=VT_DATE;
var.date=tDate;
rs->GetFields()->GetItem("拍摄日期")->Value=var;
var.Clear();
var.vt=VT_BSTR;
var.bstrVal=strTheme.AllocSysString();
rs->GetFields()->GetItem("主题名称")->Value=var;
var.bstrVal=strId.AllocSysString();
rs->GetFields()->GetItem("照片 ID")->Value=var;
CFile file;
if( !file.Open( m_strPicfile, CFile::modeRead) )
return ;
DWORD uFilesize =(DWORD) file.GetLength();
char* pBuffer = new char[uFilesize + 1];
if(pBuffer!=NULL)
{
ZeroMemory(pBuffer,uFilesize + 1);
VERIFY(file.Read(pBuffer,uFilesize)==uFilesize); VARIANT varImage;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0;
rgsabound[0].cElements = uFilesize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < (long)uFilesize; i++)
SafeArrayPutElement (psa, &i, pBuffer++);
varImage.vt = VT_ARRAY | VT_UI1;
varImage.parray = psa;
rs->GetFields()->GetItem("图片")->AppendChunk(varImage);
}
rs->Update();
pBuffer=pBuffer-uFilesize;
if(pBuffer)
{
delete [] pBuffer;
pBuffer=NULL;
}
MessageBox("添加数据成功!","提示",MB_OK|MB_ICONINFORMATION);
}
catch (_com_error e)
{
PrintComError(e);
} if(rs->State)
rs->Close();