如题,我用下面的代码将字段的值保存到表lift中出错:if(rows > m_iSaveNum) //如果有数据未保存
{
    CString* strListData;
    strListData = new CString[columns];    //获得APP类的指针
    CTacAnalysisApp *tacApp = (CTacAnalysisApp*)AfxGetApp();
    if(FAILED(tacApp->m_pRst->Open("select * from lift", (_variant_t)tacApp->m_pConn, adOpenDynamic, 
       adLockOptimistic, adCmdText)))
    {
    MessageBox("打开数据库lift表失败");
tacApp->m_pRst.Release();
return;
    }    //MessageBox("ok");
    for(int j=m_iSaveNum; j<rows; j++)
    {
tacApp->m_pRst->MoveLast();
tacApp->m_pRst->AddNew();
for(int i=0; i<columns; i++)
        {
    //获取列表中的数据
    strListData[i] = m_result_list.GetItemText(j, i);     //将数据保存到数据库中
    tacApp->m_pRst->PutCollect(_bstr_t(columnsTitle[i]), _variant_t(strListData[i]));
}

    }
    tacApp->m_pRst->Update();
}
m_iSaveNum = rows;

解决方案 »

  1.   

    先看出错的语句是哪一个语句,然后try catch等捕获一下错误信息...
      

  2.   

    好像是下面这句出错,可是没有弹出对话框啊??if(FAILED(tacApp->m_pRst->Open("select * from lift", (_variant_t)tacApp->m_pConn, adOpenDynamic, adLockOptimistic, adCmdText)))
    {
    MessageBox("打开数据库lift表失败");
    tacApp->m_pRst.Release();
    return;
    }
      

  3.   

    tacApp->m_pRst是否有值?你怎么确定是这行错?单步了吗?
      

  4.   

    如果将
    if(FAILED(tacApp->m_pRst->Open("select * from lift", (_variant_t)tacApp->m_pConn, adOpenDynamic, adLockOptimistic, adCmdText))) 

    MessageBox("打开数据库lift表失败"); 
    tacApp->m_pRst.Release(); 
    return; 
    }
    替换成
    tacApp->m_pRst = tacApp->m_pConn->Execute("select * from lift", NULL, adCmdText);
    可以通过,可是运行到
    tacApp->m_pRst->MoveLast(); 
    tacApp->m_pRst->AddNew(); 
    都出错,
    请教了,到底是怎样的错误?
      

  5.   

    发表于:2009-05-12 20:19:463楼 得分:0 
    tacApp->m_pRst是否有值?你怎么确定是这行错?单步了吗? 抱歉,由于涉及到视频操作,系统提示无法在调试模式下运行,我只能通过在不同的语句之后设置弹出对话框的方式来判断。
      

  6.   

     m_pRst是一个_RecordsetPtr?然后这个指针在这个App类中,是吧?
      

  7.   

    CTacAnalysisApp是这个程序的App类,正如你所猜测的,m_pRst是一个_RecordsetPtr 我在App类中声明并实例化了它//初始化COM组件
    CoInitialize(NULL); m_pConn.CreateInstance("ADODB.Connection");
    m_pRst.CreateInstance("ADODB.Recordset"); try
    {
    m_pConn->ConnectionString ="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=tacData"; 
    m_pConn->Open("","","",adConnectUnspecified);
    }
    catch(_com_error e)
    {
    AfxMessageBox("Connected is falied!");
    return 0;
    }
      

  8.   

    CoInitialize(NULL);
    _ConnectionPtr pConn(__uuidof(Connection));
    _RecordsetPtr pRst(__uuidof(Recordset));
    m_pConn->ConnectionString="DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost;\
    DATABASE=USERS; USER=root; PASSWORD=123456;OPTION=3;";
    你是否按的以上方式进行初始化的?CTacAnalysisApp *tacApp = (CTacAnalysisApp*)AfxGetApp();//确定你的tacApp是取到了
    tacApp->m_pConn->Open("","","",adConnectUnspecified);
    tacApp->m_pRst=tacApp->m_pConn->Execute("select * from lift",NULL,adCmdText);试试看这样
      

  9.   

    try
    {
    //tacApp->m_pRst->Open("select * from lift", (_variant_t)tacApp->m_pConn, adOpenDynamic, adLockOptimistic, adCmdText);
    tacApp->m_pConn->Open("","","",adConnectUnspecified); 
    tacApp->m_pRst=tacApp->m_pConn->Execute("select * from lift",NULL,adCmdText);  }
    catch(_com_error &e)
    {
    AfxMessageBox("Connected is falied!"); 
    tacApp->m_pRst.Release();
    return;
    }调试结果“Connected is falied!”,难道是我的tacApp没有取到?
      

  10.   

    我确信tacApp取到了,我在App类中添加了一个CString变量 m_strShow = "show" 在try之前调用它能够显示。
      

  11.   

    把连接语句放到App类的构造里面去看看,查询语句在你的对话框里用。
      

  12.   

    tacApp->m_pConn->Open("","","",adConnectUnspecified); 
    这句已经是在App类的InitInstance()函数里啊
      

  13.   

    我在另一个类里用
    tacApp->m_pRst = tacApp->m_pConn->Execute("Select * from lift", NULL, adCmdText);
    也可以啊,是不是与这个有关啊,我在那个类执行了之后再执行这个类的,没有关,是不是就不用在调用这句了?
      

  14.   

    不调用
    tacApp->m_pRst = tacApp->m_pConn->Execute("Select * from lift", NULL, adCmdText);
    的话,下面两句执行错误
    tacApp->m_pRst->MoveLast();
    tacApp->m_pRst->AddNew();
      

  15.   

    你在那个类中执行好后,要关闭连接。放InitInstance()貌似也可以,不过我说的是构造函数
      

  16.   

    问题还是没有解决,不过已经确定了是
    tacApp->m_pRst->MoveLast(); 
    tacApp->m_pRst->AddNew();
    的问题。
    对于tacApp->m_pRst->AddNew(); 是否要求表要有主键?
    继续请教
      

  17.   

    你的表有几个字段?我看到PutCollect只调用了一次?有没有不允许为NULL的字段?
    最后需要Update()、Close()和Release()。
    还有就是AddNew并不需要MoveLast()
      

  18.   

    还是那句话,单步看看theapp有没有取到,不要固执
      

  19.   

    调用
    tacApp->m_pRst->MoveLast(); 
    tacApp->m_pRst->AddNew(); 
    任意一个函数都提示:Unknow error 0x800A0CB3请问这是什么错误?
      

  20.   

    try
    {
    tacApp->m_pRst->CursorLocation = adUseClient;
    tacApp->m_pRst->Open("select * from lift where 1=1", _variant_t((IDispatch   *)tacApp->m_pConn,true), adOpenStatic, adLockReadOnly, adCmdText);
    }
    catch(_com_error &e)
    {
    CString error;
    error.Format("%s with open m_pRst in CResultTableDlg::OnSaveData()", e.ErrorMessage());
    AfxMessageBox(e.ErrorMessage()); return;
    }
    这一段是在报错的语句之前,它没有报错,应该可以确定theapp取到了吧
      

  21.   

    另外,如果我调试的话,打开视频文件后就弹出如下对话框:
    真是郁闷啊英文提示:
    Debugger detected - please close it down and restart!WinNT Users: Please note that having the WinIce/SoftIce service installed means that you are running a debugger!