Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: Access 2013, Office 2013
Si se establece la propiedad ActiveConnection en Nothing, se debiera "cerrar" el catálogo. Las colecciones asociadas estarán vacías. Todo objeto que se hubiese creado a partir de objetos de esquema en el catálogo quedará huérfano. Las propiedades para esos objetos que estén en caché seguirán estando disponibles, pero se producirá un error al intentar leer propiedades que requieran una llamada al proveedor.
// BeginCloseConnectionCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"
#include "iostream.h"
#include "stdio.h"
#include "conio.h"
//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CloseConnectionByNothingX(void);
void CloseConnectionX(void);
//////////////////////////////////////////////////////////
// //
// Main Function //
// //
//////////////////////////////////////////////////////////
void main()
{
if(FAILED(::CoInitialize(NULL)))
return;
CloseConnectionByNothingX();
CloseConnectionX();
::CoUninitialize();
}
//////////////////////////////////////////////////////////
// //
// CloseConnectionByNothingX Function //
// //
//////////////////////////////////////////////////////////
void CloseConnectionByNothingX(void)
{
HRESULT hr = S_OK;
// Define ADOX object pointers.
// Initialize pointers on define.
// These are in the ADOX:: namespace.
_CatalogPtr m_pCatalog = NULL;
_TablePtr m_pTable = NULL;
//Define ADODB object pointers
ADODB::_ConnectionPtr m_pCnn = NULL;
//Define other variables
_variant_t vIndex = (short) 0;
try
{
TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
m_pCnn->Open("Provider='Microsoft.JET.OLEDB.4.0';"
"Data Source= 'c:\\Program Files\\Microsoft Office\\"
"Office\\Samples\\Northwind.mdb';","","",NULL);
m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));
m_pTable = m_pCatalog->Tables->GetItem(vIndex);
// Cache m_pTable.Type info
cout << m_pTable->Type << endl;
_variant_t vCnn;
vCnn.vt = VT_DISPATCH;
vCnn.pdispVal = NULL;
m_pCatalog->PutActiveConnection(vCnn);
// m_pTable is orphaned
cout << m_pTable->Type << endl;
// Previous line will succeed if this was cached
cout << m_pTable->Columns->GetItem(vIndex)->DefinedSize << endl;
// Previous line will fail if this info has not been cached
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\nError\n\tSource : %s \n\tdescription : %s \n",
(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
}
catch(...)
{
cout << "Error occured in CloseConnectionByNothingX...."<< endl;
}
}
//////////////////////////////////////////////////////////
// //
// CloseConnectionX Function //
// //
//////////////////////////////////////////////////////////
void CloseConnectionX()
{
HRESULT hr = S_OK;
// Define ADOX object pointers.
// Initialize pointers on define.
// These are in the ADOX:: namespace.
_CatalogPtr m_pCatalog = NULL;
_TablePtr m_pTable = NULL;
//Define ADODB object pointers
ADODB::_ConnectionPtr m_pCnn = NULL;
//Define other variables
_variant_t vIndex = (short) 0;
try
{
TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
m_pCnn->Open("Provider='Microsoft.JET.OLEDB.4.0';"
"Data Source= 'c:\\Program Files\\Microsoft Office\\"
"Office\\Samples\\Northwind.mdb';","","",NULL);
TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));
m_pTable = m_pCatalog->Tables->GetItem(vIndex);
// Cache m_pTable.Type info
cout << m_pTable->Type << endl;
m_pCnn->Close();
// m_pTable is orphaned
cout << m_pTable->Type << endl;
// Previous line will succeed if this was cached
cout << m_pTable->Columns->GetItem(vIndex)->DefinedSize << endl;
// Previous line will fail if this info has not been cached
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\nError\n\tSource : %s \n\tdescription : %s \n",
(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
}
catch(...)
{
cout << "Error occured in CloseConnectionX...."<< endl;
}
}
// EndCloseConnectionCpp