一条简单的语句:m_pRecordset->PutCollect()就会使EXCEL文件增大一倍多,并且重新打开EXCEL后,出现“文件错误:数据可能丢失”的错误提示,点确定后,EXCEL里面的数据还在,并且完好,保存后,文件体积又变小了, 但是问题来了,再用ADO连接EXCEL就连不上了,错误提示:
CADORecordset ErrorCode = 80040e10Code meaning = IDispatch error #3088 Source = Microsoft JET Database Engine
Description = No value given for one or more required parameters.网上找了很多相关文章,大多数也都碰到过我这样的问题,但就是没找到合适的解决办法。各位请帮帮忙, 分不够再加……

解决方案 »

  1.   

    No value given for one or more required parameters
    ==================================================
    字段名称是否写错了?或者字段类型非文本,而写入的值是文本的?多贴点代码,大家一起找错。
      

  2.   

    BOOL CADORecordset::PutFieldValue(_variant_t vtFieldName, CString strValue)
    {
    _variant_t var;
    int nTemp;
    try
    {
    var = m_pRecordset->Fields->GetItem(vtFieldName)->GetValue(); switch(var.vt)
    {
    case VT_BSTR://字符串
    case VT_LPSTR:
    case VT_LPWSTR:
    //strValue = (LPCTSTR)(_bstr_t)var;
    var.bstrVal = strValue.AllocSysString();
    //m_pRecordset->Fields->GetItem(vtFieldName)->Value = var; 
    break;
    case VT_I1: //无符号字符
    case VT_UI1:
    //strValue.Format(_T("%d"),var.bVal);
    nTemp = _tstoi(strValue);
    var.bVal = (BYTE)nTemp;
    //m_pRecordset->Fields->GetItem(vtFieldName)->Value = var; 
    break;
    case VT_I2://短整型
    //strValue.Format(_T("%d"),var.iVal);
    nTemp = _tstoi(strValue);
    var.iVal = (SHORT)nTemp;
    break;
    case VT_UI2://无符号短整型
    //strValue.Format(_T("%d"),var.uiVal);
    nTemp = _tstoi(strValue);
    var.uiVal = (USHORT)nTemp;
    break;
    case VT_INT://整型
    //strValue.Format(_T("%d"),var.intVal);
    nTemp = _tstoi(strValue);
    var.intVal = (INT)nTemp;
    break;
    case VT_I4://整型
    case VT_I8://长整型
    //strValue.Format(_T("%d"),var.lVal);
    nTemp = _tstoi(strValue);
    var.lVal = (LONG)nTemp;
    break;
    case VT_UINT://无符号整型
    //strValue.Format(_T("%d"),var.uintVal);
    nTemp = _tstoi(strValue);
    var.uintVal = (UINT)nTemp;
    break;
    case VT_UI4://无符号整型
    case VT_UI8://无符号长整型
    //strValue.Format(_T("%d"),var.ulVal);
    nTemp = _tstoi(strValue);
    var.ulVal = (ULONG)nTemp;
    break;
    case VT_VOID:
    //strValue.Format(_T("%8x"),var.byref);
    break;
    case VT_R4://浮点型
    //strValue.Format(_T("%d"),(int)var.fltVal);
    nTemp = _tstoi(strValue);
    var.fltVal = (FLOAT)nTemp;
    break;
    case VT_R8://双精度型
    //strValue.Format(_T("%d"),(int)var.dblVal);
    nTemp = _tstoi(strValue);
    var.dblVal = (DOUBLE)nTemp;
    break;
    case VT_DECIMAL://小数
    //strValue.Format(_T("%d"),(int)var);
    nTemp = _tstoi(strValue);
    var = nTemp;
    break;
    case VT_CY:
    {
    //COleCurrency cy = var.cyVal;
    //strValue = cy.Format();
    var = (_variant_t)strValue;   
    var.ChangeType(VT_CY);    }
    break;
    case VT_BLOB:
    case VT_BLOB_OBJECT:
    case 0X2011:
    //strValue = "[BLOB]";
    break;
    case VT_BOOL://布尔型
    //strValue = var.boolVal?_T("TRUE"):_T("FALSE");
    break;
    case VT_DATE://日期型
    {
    //DATE dt = var.date;
    //COleDateTime da = COleDateTime(dt);
    //strValue = da.Format(_T("%Y-%m-%d %H:%M:%s"));
    }
    break;
    case VT_NULL://NULL值
    //strValue = _T("");
    var.vt = VT_BSTR;
    var.bstrVal = strValue.AllocSysString();
    break;
    case VT_EMPTY://空
    //strValue = _T("0");
    break;
    case VT_UNKNOWN://未知类型
    //strValue = _T("UN_KNOWN");
    break;
    }
    //strValue = strValue.Trim();
    m_pRecordset->Fields->GetItem(vtFieldName)->Value = var; 
    return TRUE;
    }
    catch(_com_error &e)
    {
    // dump_com_error(e);
    return FALSE;
    }
    }这是我写字段的代码,没有用m_pRecordset->PutCollect,但是同样会使EXCEL体积增大一倍多用m_pRecordset->PutCollect的效果一样,EXCEL同样被破坏
      

  3.   

    不知道你说的是Access,还是Excel,如果是Excel为什么不用自动化组件形式访问呢,干吗一定要用数据库方式访问(没用过数据库方式访问过Excel,也不知道能否用数据库方式访问Excel文件).
      

  4.   

    RsS_CONF.m_pRecordset->AddNew();

    RsS_CONF.PutFieldValue((_variant_t)"AgentIP", strAgentIP);
    RsS_CONF.PutFieldValue((_variant_t)"File Type", strFileType);
    RsS_CONF.PutFieldValue((_variant_t)"Module Name", strModule);
    RsS_CONF.PutFieldValue((_variant_t)"Name", strName);
    RsS_CONF.PutFieldValue((_variant_t)"Path", strPath);
    RsS_CONF.PutFieldValue((_variant_t)"Key Name", strKeyName);
    RsS_CONF.PutFieldValue((_variant_t)"Value", strValue);
    RsS_CONF.PutFieldValue((_variant_t)"Type", strType);
    RsS_CONF.m_pRecordset->UpdateBatch(adAffectAll);
      

  5.   

    以上是添加一行的代码,   strAgentIP,strFileType…… 为CString 类型。 工程为UNICODE
      

  6.   

    我用这种方法: RsS_CONF.m_pRecordset->PutCollect((_variant_t)"AgentIP", (_variant_t)strAgentIP)同样EXCEL会增大,并且文件被破坏  我用的是EXCEL2003
    连接字符串一下两种都试过,结果都一样:adoinfo.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties=Excel 8.0"), m_strExcelParamPath);
    adoinfo.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""), m_strExcelParamPath);
      

  7.   

    这样的问题,如果是在我本机上操作,虽然文件增大了,但不会导致文件被破坏。
    但是拿到没装EXCEL的中文本操作系统上用ADO操作后,或者拿到装了EXCEL的英文版操作系统上用ADO操作后,就会出现文件破坏的现象,并且EXCEL再也不能被ADO访问了
      

  8.   

    你excel中的"AgentIP"、"File Type"等等列都是什么类型的?
    选中列,右键,"设置单元格格式","数字"属性页,"分类"是什么?
      

  9.   

        try
        {
            var = m_pRecordset->Fields->GetItem(vtFieldName)->GetValue();
    ==========================================
    这一句去掉。
      

  10.   

    说实在的,这么看太累了,你把代码发我吧,我调调看,我下午刚装的vs2008
    [email protected]
      

  11.   

    去掉这一句? 为什么呢? 
    那我怎么能够判断var 的类型呢? 怎么给var 附上值呢?
      

  12.   

    你不要用你自己写的PutFieldValue()函数了,先。RsS_CONF.m_pRecordset->AddNew();
                                
    RsS_CONF.PutFieldValue((_variant_t)"AgentIP", strAgentIP);
    RsS_CONF.PutFieldValue((_variant_t)"File Type", strFileType);
    RsS_CONF.PutFieldValue((_variant_t)"Module Name", strModule);
    RsS_CONF.PutFieldValue((_variant_t)"Name", strName);
    RsS_CONF.PutFieldValue((_variant_t)"Path", strPath);
    RsS_CONF.PutFieldValue((_variant_t)"Key Name", strKeyName);
    RsS_CONF.PutFieldValue((_variant_t)"Value", strValue);
    RsS_CONF.PutFieldValue((_variant_t)"Type", strType);
    RsS_CONF.m_pRecordset->UpdateBatch(adAffectAll);==========================
    改成:
    RsS_CONF.m_pRecordset->AddNew();
    RsS_CONF.m_pRecordset->PutCollect((_variant_t)"AgentIP", strAgentIP);
    RsS_CONF.m_pRecordset->PutCollect((_variant_t)"File Type", strFileType);
    RsS_CONF.m_pRecordset->PutCollect((_variant_t)"Module Name", strModule);
    RsS_CONF.m_pRecordset->PutCollect((_variant_t)"Name", strName);
    RsS_CONF.m_pRecordset->PutCollect((_variant_t)"Path", strPath);
    RsS_CONF.m_pRecordset->PutCollect((_variant_t)"Key Name", strKeyName);
    RsS_CONF.m_pRecordset->PutCollect((_variant_t)"Value", strValue);
    RsS_CONF.m_pRecordset->PutCollect((_variant_t)"Type",strType);       
    RsS_CONF.m_pRecordset->Update();
    RsS_CONF.m_pRecordset->Close();不太清楚你的代码为什么一会
    RsS_CONF.m_pRecordset
    一会又直接RsS_CONF
                      
      

  13.   

    网上很多自动化访问Excel代码啊 
    http://download.csdn.net/source/398476 http://topic.csdn.net/t/20060309/09/4602265.html 
      

  14.   

    没人帮忙吗?  用地动画的话,不能查询数据啊。 我现在有查询的功能需求,所以需要用ADO
      

  15.   

    你可以先用自动化把数据导到数据库(比如Access数据库中),然后再查啊
      

  16.   

    结贴了,谢谢各位帮忙。 问题解决。我的代码没错,问题出在EXCEL稀奇古怪的格式问题上……哎