表有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字段都可以为空时,程序才运行正确这个是为什么呢?

解决方案 »

  1.   

    vaResult这个数据是否要经过转化
      

  2.   

    vaResult为_variant_t类型的
    vaResult.vt=VT_ARRAY|VT_UI1
    里面的数据是没问题的
      

  3.   

    看看你前面的程序:这样才可以,参考一下:
    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();     
      

  4.   

    我大汗淋漓阿.........
    visual c++
    oracle
    ado
      

  5.   

    可能你的代码并没有往表里写入数据,所以Update的时候该字段的值为空,所以当PHOTO和PHOTO1字段的属性有一个不可以为空时,会出现错误。储存图片 rs.CreateInstance(__uuidof(Recordset)); rs->Open("相片",_variant_t((IDispatch *)m_pConn,true), adOpenKeyset,
    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();