没怎么用过oracle, 所以希望回答能具体一些我有一个表,表结构如下
create table T_STRATEGYCONTENT
(
  STRSTRATEGYID NVARCHAR2(50),
  STRVALUE      CLOB
)查询语句如下,一执行查询语句就报错
strSQL.Format("SELECT * FROM t_StrategyContent");错误信息如下:
数据类型不被支持。
State: (null), Native: 0, Source: Microsoft OLE DB Provider for Oracle发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息。
State: (null), Native: 0, Source: Microsoft OLE DB Provider for Oracle未指定的错误
State: (null), Native: 0, Source: Microsoft OLE DB Provider for Oracle
问题:
用ADO操作oracle数据库,如何读取、插入Clob类型的字段,谢谢!

解决方案 »

  1.   

    上网去找一个封装好的ADO。
    然后把数据源配置正确,连接上,就成了。
      

  2.   

    应该定义一个指针打开oracle数据库
      

  3.   

    二进制字段的读取得用FieldsPtr对象的GetChunk函数读取,如:
     
    FieldsPtr pFields;
    FieldPtr pField;
    pFields=pPtr->Fields;
    pField = pFields->Item ["image"];
    BYTE buffer[BUFFER_SIZE];
    long pl=0;
    pField->get_ActualSize(&pl);
    int nSize = (int)pl;
    CFile fp;
    if (fp.Open (strSaveFileName,CFile::modeCreate | CFile::modeWrite) == NULL)
    {
    AfxMessageBox("Create File failed!" + strSaveFileName);
    pPtr->Close();
    pPtr.Release();
    return FALSE;
    } int nReadSize = BUFFER_SIZE;
    int nBlock = nSize / BUFFER_SIZE;
    int nTailSize = nSize - nBlock * BUFFER_SIZE; for (int i = 0;i<nBlock;i++)
    {
    _variant_t varData;
    varData = pField->GetChunk (nReadSize); AfxCopyArrayBinaryData(varData.parray,buffer,nReadSize); fp.Write (buffer,nReadSize);
    }
      

  4.   


    oid AfxCreateOneDimArray(VARIANT& varSrc, DWORD dwSize)
    {
    UINT nDim; // Clear VARIANT and re-create SafeArray if necessary
    if (varSrc.vt != (VT_UI1 | VT_ARRAY) ||
    (nDim = ::SafeArrayGetDim(varSrc.parray)) != 1)
    {
    VERIFY(::VariantClear(&varSrc) == NOERROR);
    varSrc.vt = VT_UI1 | VT_ARRAY; SAFEARRAYBOUND bound;
    bound.cElements = dwSize;
    bound.lLbound = 0;
    varSrc.parray = ::SafeArrayCreate(VT_UI1, 1, &bound);
    if (varSrc.parray == NULL)
    AfxThrowMemoryException();
    }
    else
    {
    // Must redimension array if necessary
    long lLower, lUpper;
    AfxCheckError(::SafeArrayGetLBound(varSrc.parray, 1, &lLower));
    AfxCheckError(::SafeArrayGetUBound(varSrc.parray, 1, &lUpper)); // Upper bound should always be greater than lower bound
    long lSize = lUpper - lLower;
    if (lSize < 0)
    {
    ASSERT(FALSE);
    lSize = 0; } if ((DWORD)lSize != dwSize)
    {
    SAFEARRAYBOUND bound;
    bound.cElements = dwSize;
    bound.lLbound = lLower;
    AfxCheckError(::SafeArrayRedim(varSrc.parray, &bound));
    }
    }
    }void AfxCopyBinaryData(SAFEARRAY* parray, const void* pvSrc, DWORD dwSize)
    {
    // Access the data, copy it and unaccess it.
    void* pDest;
    AfxCheckError(::SafeArrayAccessData(parray, &pDest));
    memcpy(pDest, pvSrc, dwSize);
    AfxCheckError(::SafeArrayUnaccessData(parray));
    }void AfxCopyArrayBinaryData(SAFEARRAY* parray,void* pvDest, DWORD dwSize)
    {
    // Access the data, copy it and unaccess it.
    void* pvSrc;
    AfxCheckError(::SafeArrayAccessData(parray, &pvSrc));
    memcpy(pvDest, pvSrc, dwSize);
    AfxCheckError(::SafeArrayUnaccessData(parray));
    }
      

  5.   

    http://www.vckbase.com/document/viewdoc/?id=1368