我需要同时操作两个数据库中的两个表(从一个数据库的表中读出所有记录insert到另一个数据库的表中),我建立了两个连接指针:
_ConnectionPtr m_pConnection;
_ConnectionPtr m_pConnectionSingleFile;
然后在OnInitDialog()中为这两个都生成了实例:
m_pConnection.CreateInstance("ADODB.Connection");
m_pRecordsetSingleFile.CreateInstance("ADODB.Recordset");
这样编译没有问题,但是运行到第二个 m_pRecordsetSingleFile.CreateInstance("ADODB.Recordset"); 时就报错内存不能读退出,我猜是不能同时创建同样的COM的问题吧,
请高手指点,谢谢。另外不用CreateInstance("ADODB.Connection");用了CreateInstance(__uuidof(Connection));这种方式或
CreateInstance(_uuidof(Connection));都不行,这里也顺便问一下,为何存在__uuidof(Connection)和_uuidof(Connection)两种方式呢
_ConnectionPtr m_pConnection;
_ConnectionPtr m_pConnectionSingleFile;
然后在OnInitDialog()中为这两个都生成了实例:
m_pConnection.CreateInstance("ADODB.Connection");
m_pRecordsetSingleFile.CreateInstance("ADODB.Recordset");
这样编译没有问题,但是运行到第二个 m_pRecordsetSingleFile.CreateInstance("ADODB.Recordset"); 时就报错内存不能读退出,我猜是不能同时创建同样的COM的问题吧,
请高手指点,谢谢。另外不用CreateInstance("ADODB.Connection");用了CreateInstance(__uuidof(Connection));这种方式或
CreateInstance(_uuidof(Connection));都不行,这里也顺便问一下,为何存在__uuidof(Connection)和_uuidof(Connection)两种方式呢
先open要读出数据的实例,读完后,close
再open要插入数据的实例,操作后,close。好像只能这样。
另外,m_pRecordsetSingleFile 有定义
现在的问题时无法同时使用两个数据源,至于成批加入应该是后话了.
如果你了解,请给个用于ADO的SQL成批插入的语句,不要给我一个类似下面的
insert into table1 select * from table2这样的
现在需要高手出来讲一下如何同时使用两个ADO连接实例
你可以尝试先做一个_ConnectionPtr 的实例并做一些查询,如果这个没有问题。再建立一个应该也没问题。这种连接多个数据源的我以前做过,没什么冲突。
或者你把代码列一下,大家看看。
用一个_ConnectionPtr 的实例做一些查询没有任何问题,一个连接里面建立多个数据集也没问题BOOL CHxDeployDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//下面为数据库处理
//::CoInitialize(NULL);
AfxOleInit();//使用AfxOleInit()来初始化COM库,准备使用ADO操作数据库
m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
m_pRecordset.CreateInstance("ADODB.Recordset");
// LPCSTR lpMultiByteStr="{SecondADO}";
// LPWSTR lpWideCharStr;
// MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,lpMultiByteStr,22,lpWideCharStr, 11); CComPtr<ADOConnection>m_pConnectionSingleFile;
CoCreateInstance(CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,IID_IADOConnection,(LPVOID*)&m_pConnectionSingleFile);
//m_pConnectionSingleFile.CreateInstance(__uuidof(Connection)); //每个单独的版本发布单文件对应的 Connection对象
//m_pConnectionSingleFile.CreateInstance("ADODB.Connection"); //每个单独的版本发布单文件对应的 Connection对象
m_pRecordsetSingleFile.CreateInstance("ADODB.Recordset");
return TRUE; // return TRUE unless you set the focus to a control
}里面那些注释掉的基本都是我摸索不同方法的产物,现在用CComPtr<ADOConnection>m_pConnectionSingleFile仍然不行
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF","adoEOF") BOOL CHxDeployDlg::OnInitDialog()
{
CDialog::OnInitDialog(); HRESULT hr=CoInitialize(NULL);
if (!SUCCEEDED(hr)) {
return FALSE;
}
_ConnectionPtr pConn1,pConn2;
_RecordsetPtr pRst1,pRst2;
CString strConn1,strConn2; try{
HRESULT hr = pConn1.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr)){
hr=pConn1->Open((_bstr_t)strConn1,"","",adConnectUnspecified);
}
if(SUCCEEDED(hr)){
hr=pRst1.CreateInstance("ADODB.Recordset");
}
if(!SUCCEEDED(hr)){
return FALSE;
}
}
catch(_com_error *e){
TRACE("Error Conn1:%s",e->ErrorMessage());
delete e;
} try{
HRESULT hr = pConn2.CreateInstance("ADODB.Connection");
if(SUCCEEDED(hr)){
hr=pConn2->Open((_bstr_t)strConn1,"","",adConnectUnspecified);
}
if(SUCCEEDED(hr)){
hr=pRst2.CreateInstance("ADODB.Recordset");
}
if(!SUCCEEDED(hr)){
return FALSE;
}
}
catch(_com_error *e){
TRACE("Error Conn2:%s",e->ErrorMessage());
delete e;
}
}