我打算把我的程序访问数据库的语句抽出来放到dcom 服务器做,
我的访问数据库的语句包括:查询、添加、删除、修改
现在查询已经通过接口返回_RecordSet实现,但是返回的_RecordSet 好像不支持添加、删除、修改。
如何实现添加、删除、修改呢?
我的访问数据库的语句包括:查询、添加、删除、修改
现在查询已经通过接口返回_RecordSet实现,但是返回的_RecordSet 好像不支持添加、删除、修改。
如何实现添加、删除、修改呢?
调试欢乐多
2、添加、删除、修改一般不用_RecordSet 吧?一般用Connection吧?
我觉得,涉及到增、删、改,还是用Connection
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;
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;
}
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 无法添加记录!
to jifeng1123:我这些几乎是全部代码了。
但是你可以用将Select的SQL语句换成正确的Insert的语句,执行它就可以插入记录了。
AddNew()
PutCollect()
Update();
我试了很多次没过。郁闷啊!有空的话,将你的源代码打个包发一下给我,让我看看什么地发出错了
//pRecordSet.CreateInstance(__uuidof(Recordset));
pUnknown = (IUnknown*)pRecordSet.Detach(); //第一次
m_SqlEdit = "Select * from Customers";
m_pDBInterface->SelectRecord(m_SqlEdit.AllocSysString(), &pUnknown);
pRecordSet.Attach((_Recordset *)pUnknown);//第二次
我怀疑可能是在这两个地方出问题了!我测试一下!看看先!
不要意思最近很忙,请大家原谅!
我看到msdn这样一篇文章是关于修改的
http://support.microsoft.com/kb/193515/EN-US/, 大家可以简单看看!
_RecordsetPtr pRecordSet;
m_SqlEdit = "Select * from Customers";
m_pDBInterface->SelectRecord(m_SqlEdit.AllocSysString(), (IUnknown*)&pRecordSet);
//然后用pRecordSet进行添加.....
{
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);
可行!测试过了!
我按你说的写了,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();
我的server端也就是打开记录集,然后把它传出去!