最近在尝试用VC做一个Oracle的Trigger的管理工具,可是发现user_triggers表中的trigger_body是LONG类型的,默认读取只有前面一截。我用的是ADO方式,加载的msado15.dll。网上找了很多资料,有说法用set long 1000就可以,我在sqlplus中试了,确实好用,可是ADO执行这句话就报错,ORA-00922,缺少或者无效选项。谁帮我想想办法,解决途径可能从两个方面入手,第一是想办法把这个long里面的内容全部读取出来,第二个是Oracle里面那么多神秘的包,有没有哪个包能根据trigger名称获取到trigger_body的全部内容谢谢大家

解决方案 »

  1.   

    http://topic.csdn.net/t/20020725/15/901527.html
      

  2.   

    把LONG字段当成字符串等方式读取出来..
      

  3.   


    这个是java的方式啊,VC的ADO的方式有吗
      

  4.   

    调用java方法对应的ado方法就可以了啊或者自己google
      

  5.   

    vnRCount=m_pRst->Fields->Item[_variant_t((short)1)]->Value;
    CString m_db2=(char*)_bstr_t(vnRCount.bstrVal);当成字符串读试试,机器没有Oracle没试
      

  6.   

    俺以前写的函数,楼主可以试试:UINT GetBlobData(_RecordsetPtr m_pRs, LPCTSTR lpField, LPVOID lpBuff)
    {
    UINT dwSize = m_pRs->Fields->Item[lpField]->ActualSize;
    if (dwSize > 0)
    {
    LPBYTE pBuff = (LPBYTE)lpBuff;
    ULONG uOffset=0;
    _variant_t varChunk;
    while(uOffset < dwSize)
    {
    varChunk = m_pRs->Fields->Item[lpField]->GetChunk(dwChunkSize);
    LONG dwRead = varChunk.parray->rgsabound[0].cElements;
    MoveMemory(pBuff, varChunk.parray->pvData, dwRead);
    pBuff += dwRead;
    uOffset += dwRead;
    }
    return dwSize;
    }
    else
    {
    return 0;
    }
    }LPBYTE GetBlobData(_RecordsetPtr m_pRs, LPCTSTR lpField, DWORD& dwSize)
    {
    dwSize = m_pRs->Fields->Item[lpField]->ActualSize;
    if (dwSize > 0)
    {
    LPBYTE pBuff = (LPBYTE)GlobalAlloc(GPTR, dwSize);
    if (pBuff != NULL)
    {
    LPBYTE lpData = pBuff;
    ULONG uOffset=0;
    _variant_t varChunk;
    while(uOffset < dwSize)
    {
    varChunk = m_pRs->Fields->Item[lpField]->GetChunk(dwChunkSize);
    LONG dwRead = varChunk.parray->rgsabound[0].cElements;
    MoveMemory(pBuff, varChunk.parray->pvData, dwRead);
    pBuff += dwRead;
    uOffset += dwRead;
    }

    return lpData;
    }
    } return NULL;
    }
    第一个读取的内容在lpBuff中,并返回内容的长度;
    第二个返回读取的内存(该内存用完请GlobalFree自行释放)和内容的长度。
      

  7.   

    读BLOB字段无问题,俺不知道可不可以读LONG。
    另:dwChunkSize为常数,俺一般定义为10240(10K)
      

  8.   

    谢谢Lin,我照着做了,发现还是不行 
    程序运行到
    LONG dwRead = varChunk.parray->rgsabound[0].cElements;
    下一行时报告错误,跟踪发现这个时候dwRead是7M多...下面的内存拷贝肯定出错而且刚开始
    dwSize = m_pRs->Fields->Item[lpField]->ActualSize;
    这句话取到的dwSize也不对,才200,而实际的有900多个字节也许这个方法仅仅是针对Blob或者Clob做的吧~~
      

  9.   

    最终自己解决了。不用ADO,改用了一个叫OO4O的搞定了