本人才学MFC  
用ADO连接SQL SERVER 2005
连上以后 可以实现查询数据库表内容等一些基本功能了
但发现  我无法想表中增加记录
试过AddNew();
也试过用Excute()执行Insert into语句  就是报错 要不说未指定的错误,IDispatch error.....m_pRecordset->AddNew();
m_pRecordset->PutCollect("Reader_Name" ,_variant_t(m_newReader_Name));
m_pRecordset->PutCollect("Phone_Num" ,_variant_t(m_newPhone_Num));
m_pRecordset->PutCollect("Person_ID" ,_variant_t(m_newPersonID));其中m_newReader_Name,m_newPhone_Num,m_newPersonID是三个CString类型,是编辑控件的值..
而Reader_Name,Phone_Num,Person_ID是数据库的一个表的三个属性...一编译可以通过  一执行的时候就显示 未指定的错误谁可以帮帮忙么?先谢谢 小弟感激不尽

解决方案 »

  1.   

    m_pRecordset
    是否在使用之前已经初始化?CString sql1("select * from table t where Reader_Name='");
    sql1+=m_newReader_Name;
    sql1+="'";

    m_pRecordset.CreateInstance(__uuidof(Recordset));
    m_pRecordset->Open((_variant_t)sql1,_variant_t((IDispatch*)m_pConn,true),adOpenStatic,adLockOptimistic,adCmdText);m_pRecordset->AddNew()之前先执行这几句看看。
      

  2.   


    BOOL CADODatabase::Open(LPCTSTR lpstrConnection, LPCTSTR lpstrUserID, LPCTSTR lpstrPassword)
    {
    HRESULT hr = S_OK; if(IsOpen())
    Close(); if(strcmp(lpstrConnection, _T("")) != 0)
    m_strConnection = lpstrConnection; ASSERT(!m_strConnection.IsEmpty()); try
    {
    if(m_nConnectionTimeout != 0)
    m_pConnection->PutConnectionTimeout(m_nConnectionTimeout);
    hr = m_pConnection->Open(_bstr_t(m_strConnection), _bstr_t(lpstrUserID), _bstr_t(lpstrPassword), NULL);
    return hr == S_OK;
    }
    catch(_com_error &e)
    {
    return FALSE;
    }

    }//  把要执行的插入语句放在这里……
    BOOL CADODatabase::Execute(LPCTSTR lpstrExec)
    {
    ASSERT(m_pConnection != NULL);
    ASSERT(strcmp(lpstrExec, _T("")) != 0);
    _variant_t vRecords;

    try
    {
    m_pConnection->CursorLocation = adUseClient;
    m_pConnection->Execute(_bstr_t(lpstrExec), &vRecords, adExecuteNoRecords);
    return TRUE;
    }
    catch(_com_error &e)
    {

    return FALSE;
    }
    }
      

  3.   


    哎  貌似一直有问题哎  
    在AddNew()前加上你给的句子  显示IDispatch error #3092
      

  4.   

    还是那句话,通过sql语句来操作数据库是最安全的,我始终相信这点~我上面不是有一个Execute的函数吗,你就用那个函数,把sql语句带进去,至于怎么带,可以这样:
    CString strSql;
    CString str1,str2,str3;
    str1 = _T("Test1");
    str2 = _T("Test2");
    str3 = _T("Test3");
    strSql.Format(_T("Insert into tb(col1,col2,col3)"  //故意换行看看,
                        " values('%s','%s','%s')"),str1,str2,str3);m_pConnection->Execute(strSql);大致就这样啦,good luck~
      

  5.   

    m_pRecordset 使用前,你必须是打开了你要操作的表的记录集。
    例如:你要插入A表
    _RecordsetPtr m_pRecordset;
    m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset->Open("select * from A",
    _variant_t((IDispatch*pConn,true),adOpenStatic,adLockOptimistic,adCmdText);
    pConn 是你到A表数据库的连接
    注意:这里的记录集必须是用m_pRecordset->Open打开,其他都不行。
      

  6.   

    回答楼主的问题~
    m_pRecordset->AddNew(); //挂起一个记录
    m_pRecordset->PutCollect("Reader_Name" ,_variant_t(m_newReader_Name)); //增加
    m_pRecordset->PutCollect("Phone_Num" ,_variant_t(m_newPhone_Num));     //增加
    m_pRecordset->PutCollect("Person_ID" ,_variant_t(m_newPersonID));     //增加// 这里为什么不更新提交???
    m_pRecordset->Update()更新到数据库  或者
    m_pRecordset->UpdateBatch(adAffectCurrent)//将当前挂起的记录更新到数据库这样就可以了~~
    AddNew()可不负责把数据,放进数据库啊.它将数据挂起读入内存而已!