clob要用大字段方式写入。不能用字符串了。

解决方案 »

  1.   

    如下,写入大字段:
    BOOL CDBImp::AddDayForecast(WEATHER_WRITE_INFO writeInfo)
    {
    CFile file;
    if(!file.Open(writeInfo.sFileName,CFile::modeRead))
    {
    return FALSE;
    }
    int nLen = file.GetLength();
    char *pBufSource = new char[nLen + 1];
    char *pBuf = pBufSource;
    file.ReadHuge(pBufSource,nLen);
    pBufSource[nLen] = '\0';
    file.Close(); VARIANT varBLOB;
    SAFEARRAY *psa;
    SAFEARRAYBOUND rgsabound[1]; CString sSqlStr;
    try
    {
    //alter system set large_pool_size=20000000 scope=both
    _RecordsetPtr piRecordset = NULL;
    CREATEINSTANCE(piRecordset,Recordset);
    sSqlStr = "SELECT * FROM SW_WEATHERINFO";
    piRecordset->Open(_bstr_t(sSqlStr), _variant_t((IDispatch *)m_piConnection, true),adOpenStatic, adLockOptimistic, adCmdText);
    m_piConnection->BeginTrans();
    piRecordset->AddNew();
    int nIdx = writeInfo.sFileName.ReverseFind('\\');
    CString sName = writeInfo.sFileName.Mid(nIdx + 1);
    piRecordset->PutCollect("BINARYNAME",_variant_t(sName));        
    piRecordset->PutCollect("VERSION",_variant_t((long)writeInfo.nVersion));          
    piRecordset->PutCollect("SOURCENAME",_variant_t(writeInfo.sSoureName));             
    piRecordset->PutCollect("STYLE",_variant_t((long)writeInfo.eType));             
    piRecordset->PutCollect("FORECASTTIME",_variant_t(writeInfo.tForecastTime));             
    if(pBuf)
    {    
       rgsabound[0].lLbound = 0;
       rgsabound[0].cElements = nLen;
       psa = SafeArrayCreate(VT_UI1, 1, rgsabound);                      //创建SAFEARRAY对象
       for (long i = 0; i < (long)nLen; i++)
      SafeArrayPutElement (psa, &i, pBuf++);                         ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
       varBLOB.vt = VT_ARRAY | VT_UI1;                                   //将varBLOB的类型设置为BYTE类型的数组
       varBLOB.parray = psa;                                             //为varBLOB变量赋值
       piRecordset->GetFields()->GetItem("CONTENT")->AppendChunk(varBLOB);//加入BLOB类型的数据

    piRecordset->Update();
    m_piConnection->CommitTrans();
    delete []pBufSource;
    }
    catch(_com_error &e)
    {
    theApp.MakeLog(sSqlStr,"Main");
    DBErrManage(e);
    DisConnect();
    delete []pBufSource;
    return FALSE;
    }
    return TRUE;
    }