在添加数据时候,为什么一执行到AddNew这句话就出错啊,还需要什么语句。例如moveFirst之类的话吗?

解决方案 »

  1.   

    _variant_t RecordsAffected;
    m_pRsInfo=m_pConInfo->Execute((LPCTSTR)strSql,&RecordsAffected,adCmdText);
    int i =0;
    while (m_pRsOSInfo->EndOfFile == VARIANT_FALSE)
    {
       i++;
                m_pRsInfo->MoveNext();
    }
    这是它前面的语句,应该是打开的
      

  2.   

    _variant_t RecordsAffected;
    m_pRsInfo=m_pConInfo->Execute((LPCTSTR)strSql,&RecordsAffected,adCmdText);
    int i =0;
    while (m_pRsInfo->EndOfFile == VARIANT_FALSE)
    {
       i++;
                m_pRsInfo->MoveNext();
    }
    这是它前面的语句,应该是打开的
      

  3.   

    用 Execute 返回的行集有可能是 Readonly类型的.
      

  4.   

    Execute 返回的 Recordset 对象始终为只读、仅向前的游标。如需要具有更多功能的 Recordset 对象,应首先创建具有所需属性设置的 Recordset 对象,然后使用 Recordset 对象的 Open 方法执行查询并返回所需游标类型。
      

  5.   

    附ADO连接sql server的方法:在stdafx.h中添加:
    #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")正式代码:
    _RecordsetPtr m_pRs;
    _ConnectionPtr m_pConn;
    try
    {
    CoInitialize(NULL); m_pConn.CreateInstance(__uuidof(Connection));
    m_pRs.CreateInstance(__uuidof(Recordset));

    //设置服务器端游标
    m_pConn->CursorLocation = adUseServer;//adUseClient;adUseNone

    //连接数据库
    m_pConn->Open(L"Provider=SQLOLEDB.1;Password=a;Persist Security Info=True;User ID=sa;Initial Catalog=tanyizhiDB;Data Source=192.168.1.23",L"",L"",adOpenUnspecified);


    m_pRs->PutRefActiveConnection(m_pConn);
    CString t = "select * from case_acceptinfo";
    m_pRs->Open(_variant_t(t),_variant_t((IDispatch*)m_pConn,true),adOpenDynamic,adLockOptimistic,adCmdUnknown);

    while(!m_pRs->adoEOF)
    {
    CString m_s1 = _com_util::ConvertBSTRToString((_bstr_t)m_pRs->GetCollect("reporttime"));
    MessageBox(m_s1); m_pRs->MoveNext();
    } m_pRs->Close();
    m_pConn->Close(); m_pRs=NULL;
    m_pConn=NULL;
    CoUninitialize();
    }
    catch(_com_error &e)
    {
    AfxMessageBox(e.Description());
    }
      

  6.   

    呵呵,附上我的代码,请高手帮我看看怎么优化,我的代码有些冗杂,主要功能就是先查找,如果数据库里面没有数据就添加
    CString strSql;
    strSql.Format("select * from Info where Type = '%s' and Version = '%s'",pInfo->GetType(),pInfo->GetVersion());
    BSTR bsSql = strSql.AllocSysString();
    _variant_t RecordsAffected;
    // m_pRsInfo=m_pConInfo->Open((LPCTSTR)strSql,&RecordsAffected,adCmdText);
     //   m_pConOSInfo->Open((_variant_t)strSql,)
    m_pConInfo->Open(_variant_t(strSql),_variant_t((IDispatch*)m_pConInfo,true),adOpenDynamic,adLockOptimistic,adCmdUnknown);
    int i =0;
    while (m_pRsInfo->EndOfFile == VARIANT_FALSE)
    {
    i++;
            m_pRsInfo->MoveNext();
    }
    m_pRsInfo->MoveFirst();
    if (i ==0)
    {
            try
    {      
    m_pRsInfo->AddNew();
    m_pRsInfo->PutCollect("OSType", _variant_t(pInfo->GetType()));                   m_pRsInfo->PutCollect("OSVersion", _variant_t(pInfo->GetVersion()));
    m_pRsInfo->Update();
    }
    catch(_com_error *e)
    {

    AfxMessageBox(e->ErrorMessage());
    return FALSE;
    }
    return TRUE;
    }
    else  return FALSE;
      

  7.   

    1.判断是否结束到末尾
    如果你在stdafx.h中加入
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 
    那么
    while(!pRs->adoEOF)
    2.为什么不用Execute(sql)或者rs.open(sql)来执行,多方遍阿