我打算把我的程序访问数据库的语句抽出来放到dcom 服务器做,
我的访问数据库的语句包括:查询、添加、删除、修改
现在查询已经通过接口返回_RecordSet实现,但是返回的_RecordSet 好像不支持添加、删除、修改。
如何实现添加、删除、修改呢? 

解决方案 »

  1.   

    1、有可以能是_RecordSet 里的某些参数设置有问题。
    2、添加、删除、修改一般不用_RecordSet 吧?一般用Connection吧?
    我觉得,涉及到增、删、改,还是用Connection
      

  2.   

    这可能不是DCOM的问题,建议看一下你对数据库的操作权限。
      

  3.   

    我把代码贴出来:大家一起看看,谁解决我马上至少一百分相送!
    server:
    _ConnectionPtr pConn;
    _RecordsetPtr  pRecordSet, pRecordSetClone=NULL; try
    {
    //创建连接指针
    pConn.CreateInstance(__uuidof(Connection));
    pConn->Open("Provider=SQLOLEDB.1; Data Source=GQH;Initial Catalog=Northwind", "sa", "", adModeUnknown);
    }
    catch(_com_error & e)
    {
    IErrorInfo * pErrorInfo = e.ErrorInfo();
    HRESULT hr = e.Error();

    if (pErrorInfo)
    {
    BSTR bsDesc = NULL;
    pErrorInfo->GetDescription(&bsDesc);
    _bstr_t sDesc(bsDesc, FALSE);
    pErrorInfo->Release();
    } return S_FALSE;
    } try 
    {
    pRecordSet.CreateInstance(__uuidof(Recordset));
    pRecordSet->CursorLocation = adUseClient;
    pRecordSet->Open(Sql, _variant_t((IDispatch*)pConn.GetInterfacePtr()), 
    adOpenKeyset,adLockOptimistic,adCmdText); pRecordSet->put_ActiveConnection(vtMissing);
    pRecordSetClone = pRecordSet->Clone(adLockOptimistic);

    pRecordSet.Release();
    *ppRS = (IUnknown *)pRecordSetClone.Detach();
    }
    catch(_com_error & e)
    {
    IErrorInfo * pErrorInfo = e.ErrorInfo();
    HRESULT hr = e.Error();

    if (pErrorInfo)
    {
    BSTR bsDesc = NULL;
    pErrorInfo->GetDescription(&bsDesc);
    _bstr_t sDesc(bsDesc, FALSE);
    pErrorInfo->Release();
    }

    return S_FALSE;
    }

    return S_OK;
      

  4.   

    server
    STDMETHODIMP CIDBInterface::SelectRecord(BSTR Sql, IUnknown **ppRS)
    {
    _ConnectionPtr pConn;
    _RecordsetPtr  pRecordSet, pRecordSetClone=NULL; try
    {
    //创建连接指针
    pConn.CreateInstance(__uuidof(Connection));
    pConn->Open("Provider=SQLOLEDB.1; Data Source=GQH;Initial Catalog=Northwind", "sa", "", adModeUnknown);
    }
    catch(_com_error & e)
    {
    IErrorInfo * pErrorInfo = e.ErrorInfo();
    HRESULT hr = e.Error();

    if (pErrorInfo)
    {
    BSTR bsDesc = NULL;
    pErrorInfo->GetDescription(&bsDesc);
    _bstr_t sDesc(bsDesc, FALSE);
    pErrorInfo->Release();
    } return S_FALSE;
    } try 
    {
    pRecordSet.CreateInstance(__uuidof(Recordset));
    pRecordSet->CursorLocation = adUseClient;
    pRecordSet->Open(Sql, _variant_t((IDispatch*)pConn.GetInterfacePtr()), 
    adOpenKeyset,adLockOptimistic,adCmdText); pRecordSet->put_ActiveConnection(vtMissing);
    pRecordSetClone = pRecordSet->Clone(adLockOptimistic);

    pRecordSet.Release();
    *ppRS = (IUnknown *)pRecordSetClone.Detach();
    }
    catch(_com_error & e)
    {
    IErrorInfo * pErrorInfo = e.ErrorInfo();
    HRESULT hr = e.Error();

    if (pErrorInfo)
    {
    BSTR bsDesc = NULL;
    pErrorInfo->GetDescription(&bsDesc);
    _bstr_t sDesc(bsDesc, FALSE);
    pErrorInfo->Release();
    }

    return S_FALSE;
    }

    return S_OK;
    }
      

  5.   

    client
    HRESULT hr;
    CString str;
    //指针
    IUnknown *pUnknown;
    //组件库初始化
    hr = CoInitialize(NULL);

    if (FAILED(hr))
    {
    MessageBox("组件初始化失败!", "提示信息", MB_ICONWARNING);
    return FALSE;
    }

    //安全代码初始化
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, //默认安全级别 "无"
    RPC_C_IMP_LEVEL_IDENTIFY, //标识
    NULL, 0, NULL);

    if (FAILED(hr))
    {
    MessageBox("组件初始化失败!", "提示信息", MB_ICONWARNING);
    return FALSE;
    }

    CString HostName;
    m_IpAddress.GetWindowText(HostName);

    HostName = "GQH";
    //COSERVERINFO ServerInfo = {0, (LPWSTR)(LPCTSTR)HostName, NULL, 0};
    COSERVERINFO ServerInfo = {0, L"GQH", NULL, 0};

    MULTI_QI MultiQi = {&IID_IUnknown, NULL, NOERROR};

    //CLSCTX_REMOTE_SERVER 为远程服务器组件
    hr = CoCreateInstanceEx(CLSID_IDBInterface, NULL, CLSCTX_REMOTE_SERVER, 
    &ServerInfo, 1, &MultiQi);

    if (FAILED(hr))
    {
    MessageBox("创建对象实例失败!", "提示信息", MB_ICONWARNING);
    return FALSE;
    }

    //得到IUnknown指针
    pUnknown = (IUnknown *)MultiQi.pItf;

    //通过IUnknown指针去查询接口指针, 返回IAccount指针
    hr = pUnknown->QueryInterface(IID_IIDBInterface, (void**)&m_pDBInterface);

    if (FAILED(hr))
    {
    MessageBox("没有查找的接口指针!", "提示信息", MB_ICONWARNING);
    return FALSE;
    }

    //IUnknown接口释放
    pUnknown->Release();
    _RecordsetPtr  pRecordSet;
    //CAdoRecordSet RS;
    //pRecordSet.CreateInstance(__uuidof(Recordset));
    pUnknown = (IUnknown*)pRecordSet.Detach();

    m_SqlEdit = "Select * from Customers";

    m_pDBInterface->SelectRecord(m_SqlEdit.AllocSysString(), &pUnknown);

    pRecordSet.Attach((_Recordset *)pUnknown);
              然后对pRecordSet 无法添加记录!
      

  6.   

    是不是这时候得到的pRecordSet 不支持添加、修改记录呢?
      

  7.   

    对pRecordSet 的遍历很正常,也能得到正确的结果!
      

  8.   

    我估计帮不了你!不过对此比较感兴起,能否将server和client打个包发给我一分!谢谢![email protected]
      

  9.   

    to 风一飞: 我试了好像不行。
    to jifeng1123:我这些几乎是全部代码了。
      

  10.   

    你用m_SqlEdit = "Select * from Customers";默认情况下Select出来的数据集当然没有办法添加记录。
    但是你可以用将Select的SQL语句换成正确的Insert的语句,执行它就可以插入记录了。
      

  11.   

    to  wangk:不使用dcom, 直接客户端连接数据服务器,这是可以的。可以调用
    AddNew()
    PutCollect()
    Update();
      

  12.   

    试一下用insert into. 顶
      

  13.   

    我照你的源代码输了一遍,编译也好了!可是在打开客户端程序的时候,出现了dcom安全初始化错误,
    我试了很多次没过。郁闷啊!有空的话,将你的源代码打个包发一下给我,让我看看什么地发出错了
      

  14.   

    客户端有这一句打开
     //pRecordSet.CreateInstance(__uuidof(Recordset));
      

  15.   

    dcom 安全初始化错误,需要配置你的组件,可以从网上查一下不是程序的原因
      

  16.   

    我,我来了!不好意思!我看了你代码!你把pRecordset倒来倒去,最终说不能添加删除了!
    pUnknown = (IUnknown*)pRecordSet.Detach();    //第一次
    m_SqlEdit = "Select * from Customers";

    m_pDBInterface->SelectRecord(m_SqlEdit.AllocSysString(), &pUnknown);

    pRecordSet.Attach((_Recordset *)pUnknown);//第二次
    我怀疑可能是在这两个地方出问题了!我测试一下!看看先!
    不要意思最近很忙,请大家原谅!
      

  17.   

    版主终于来了,看来偶是有救了。
    我看到msdn这样一篇文章是关于修改的 
    http://support.microsoft.com/kb/193515/EN-US/, 大家可以简单看看!
      

  18.   

    你改成:
    _RecordsetPtr  pRecordSet;

    m_SqlEdit = "Select * from Customers";

    m_pDBInterface->SelectRecord(m_SqlEdit.AllocSysString(), (IUnknown*)&pRecordSet);

    //然后用pRecordSet进行添加.....
      

  19.   

    to wangweixing2000: 我Addnew 的时候,提示错误啊。
      

  20.   

    long CADORecordSet::GetSet(IUnknown **pSet)
    {

    HRESULT hr = m_recordset.QueryInterface(__uuidof(IUnknown),(IUnknown**)pSet);
    return hr;
    }
    client:
    _RecordsetPtr m_pSet;
    adoSet.GetSet((IUnknown**)&m_pSet);
    HRESULT hr = m_pSet->Delete(adAffectAll);
    可行!测试过了!
      

  21.   

    to  wangweixing2000(星(inspiration(灵感))): 
        我按你说的写了,server 端, 我这样
    pRecordSet.CreateInstance(__uuidof(Recordset));
    pRecordSet->CursorLocation = adUseClient;
    pRecordSet->Open(Sql, _variant_t((IDispatch*)m_pConn.GetInterfacePtr()), 
    adOpenDynamic,adLockOptimistic,adCmdText); hr = pRecordSet.QueryInterface(__uuidof(IUnknown), (void **)ppRS);
    不对这样也不对。
    pRecordSet.CreateInstance(__uuidof(Recordset));
    pRecordSet->CursorLocation = adUseClient;
    pRecordSet->Open(Sql, _variant_t((IDispatch*)m_pConn.GetInterfacePtr()), 
    adOpenDynamic,adLockOptimistic,adCmdText); // hr = pRecordSet.QueryInterface(__uuidof(IUnknown), (void **)ppRS);

    pRecordSet->put_ActiveConnection(vtMissing);
    pRecordSetClone = pRecordSet->Clone(adLockOptimistic);

    hr = pRecordSetClone.QueryInterface(__uuidof(IUnknown), (void **)ppRS);

    pRecordSet.Release();
      

  22.   

    能告诉我你server 端的具体代码吗?谢谢你了!
      

  23.   

    pRecordSet.Release();不能调用,因为我看出你用的是智能指针!
    我的server端也就是打开记录集,然后把它传出去!
      

  24.   

    客户端调用pRecordSet->Delete(adAffectCurrent)时出现异常,结果也就不对。
      

  25.   

    您有msn 吗? 我把源程序发给你看看。