Cómo usar ADOX de C++ para copiar un archivo de base de datos de Jet anterior a una nueva base de datos de formato de Jet 4.0

Seleccione idioma Seleccione idioma
Id. de artículo: 321328 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

Resumen

En este artículo se muestra cómo utilizar ActiveX Data Objects Extensions para Data Definition Language and Security (ADOX) con Visual C++ para crear una nueva base de datos Jet utilizando datos de una base de datos Jet con formato antiguo. En este artículo también se demuestra las técnicas siguientes que se utilizan en ADOX con Visual C++:
  • Cómo usar ADOX con Visual C++ para crear una base de datos Jet
  • Cómo obtener la lista de tablas en una base de datos
  • Cómo obtener los metadatos de una tabla, incluidas las columnas y tipos
  • Cómo utilizar el método Append de ADOX para crear tablas y columnas
  • Cómo utilizar propiedades específicas del proveedor de OLE DB de Jet para crear una tabla vinculada
  • Cómo utilizar ADO en combinación con ADOX para copiar datos desde una base de datos a otro
  • Cómo eliminar una tabla de una base de datos Jet

Más información

Probar el método CompactDatabase de objetos de replicación de Jet (JRO) revela que el método no no efectively el convertir una tabla al formato de Jet 4.0 si se encuentra la tabla de origen en Access 2.0 o en formato de Access 95. Si una tabla que se genera mediante Access 2.0 o Access 95 se convierte al formato de Jet 4.0 mediante el método CompactDatabase del objeto JRO, Access 2000 o Access 2002 no puede abrir correctamente la base de datos. Este problema está todavía bajo investigación de Microsoft. Tenga en cuenta que se pretendían sólo funcionan con Jet 4.0 y Jet 3.5 x bases de datos de formato de objetos JRO.

Para convertir la base de Jet datos anterior (anterior a formato de Jet 3.5), utilice ADOX para crear una base de datos nueva con 4.0 formato y copiar todas las tablas. El código siguiente muestra cómo hacerlo. Se trata de un ejemplo sencillo y no aborda varios escenarios especiales, como claves principales, índices, propiedades y relaciones. El ejemplo copia sólo las tablas y no copiar otros objetos de la base de datos de origen. Para obtener información adicional acerca estas técnicas, consulte la documentación de ADOX en el sitio Web de MSDN Library.

Guarde el código siguiente en un proyecto de C++ y, a continuación, genere el proyecto:

Nota : no es necesario cambiar nada en el código excepto para las rutas en las cadenas # Import y conexión.
#import "c:\Program Files\Common Files\system\ado\msado15.dll" 
#import "c:\Program Files\Common Files\system\ado\msadox.dll"

#include <iostream>
using namespace std;

void main()
{
	
   CoInitialize(NULL);
	
   //ADO Connection Object pointers for source and destination.
   ADODB::_ConnectionPtr SourceCon = NULL;
   ADODB::_ConnectionPtr DestCon = NULL;

   //ADOX Catalog object pointers for source and destination.
   ADOX::_CatalogPtr DestDB = NULL;
   ADOX::_CatalogPtr SourceDB = NULL;
	
   //Connection string. 
   _bstr_t SrcConnectionString(L""), DestConnectionString(L""), SourceDBLocation(L"");

   ADOX::_TablePtr linkedTbl = NULL;
   ADOX::_ColumnPtr f = NULL;
   ADOX::_TablePtr DestTable = NULL;

   try{

         SourceDBLocation = (L"C:\\JET30FormatDB.mdb");
         //Per Q299484, you must use ODBC Provider to avoid alphabetical ordering.
         SrcConnectionString = "Driver={Microsoft Access Driver (*.mdb)};"
			"DBQ=" + SourceDBLocation; 

         DestConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
			  "Data Source=C:\\JET40FormatDB.mdb;"	;

         SourceCon.CreateInstance(__uuidof(ADODB::Connection));
         SourceCon->Open(SrcConnectionString,"","",-1);
         SourceDB.CreateInstance(__uuidof (ADOX::Catalog));
         //ADOX catalog must have an active ADO connection 
         SourceDB->PutActiveConnection(_variant_t((IDispatch *) SourceCon));
		
         DestDB.CreateInstance(__uuidof (ADOX::Catalog));
		
         //This line creates a Jet database, and throws an exception if it already exists.
         DestDB->Create(DestConnectionString);
         DestCon.CreateInstance(__uuidof(ADODB::Connection));
         DestCon->Open(DestConnectionString,"","",-1);
         DestDB->PutActiveConnection(_variant_t((IDispatch *) DestCon));

         //Get the count of tables in Source Database.
         long x = SourceDB->Tables->Count;
         for (int i = 0; i < x ; i++)
         {
            // Go through each table that is listed as TABLE and not SYSTEM TABLE or ACCESS SYSTEM TABLE.
            if (SourceDB->Tables->Item[(long)i]->Type == _bstr_t(L"TABLE"))
            {
               cout<<"Now copying "<< (LPCSTR)SourceDB->Tables->Item[(long)i]->Name<<endl;
               _bstr_t tblName = SourceDB->Tables->Item[(long)i]->Name;
               //Start creating a table.
               DestTable.CreateInstance(__uuidof(ADOX::Table));
               DestTable->Name = tblName;

               //Get number of columns in Source Table. 
               int cnt = SourceDB->Tables->Item[tblName]->Columns->Count;
				
               //Use ADOX Append method to append all columns to the destination table. 
               for ( int col = 0; col < cnt; col++)
               {
                  f = SourceDB->Tables->Item[tblName]->Columns->Item[(long)col];
                 DestTable->Columns->Append(f->Name,f->Type,f->DefinedSize);
               }
					
               //Finally, append destination table.
               DestDB->Tables->Append( DestTable.GetInterfacePtr());

               //This step is to get the data from source table. 
               //Create a temporary linked table in Destination Database
               //and run "Insert Into mynewTable Select * from LinkedTable".
               linkedTbl.CreateInstance(__uuidof(ADOX::Table));
               linkedTbl->ParentCatalog = DestDB;
               linkedTbl->Name = "TempLink2";
               linkedTbl->Properties->Item["Jet OLEDB:Create Link"]->Value = (long)true;
               linkedTbl->Properties->Item["Jet OLEDB:Link Datasource"]->Value = SourceDBLocation;      
               linkedTbl->Properties->Item["Jet OLEDB:Remote Table Name"]->Value = tblName;
				DestDB->Tables->Append(linkedTbl.GetInterfacePtr());

               DestCon->Execute("Insert into " + tblName + " Select * From TempLink2", NULL, -1);
               //You do not have to keep this linked table around, so you can delete it. 
               DestDB->Tables->Delete("TempLink2");
               DestTable.Release();
               linkedTbl.Release();
            }
            else
            {
               cout <<"Skipping "<< (LPCSTR)SourceDB->Tables->Item[(long)i]->Name <<endl;
            }
			
        } // End of for loop.
				
        DestCon->Close();
        SourceCon->Close();
       }
       catch(_com_error &e)
       {
         _bstr_t bstrSource(e.Source());
         _bstr_t bstrDescription(e.Description());
         cout<< "Source: "<< (LPCSTR)bstrSource <<"\nDescription : " << (LPCSTR)bstrDescription <<endl;
       }
}
				

Referencias

Para obtener más información, visite MSDN Library en el siguiente sitio Web de Microsoft:
http://msdn2.microsoft.com/en-us/library/default.aspx
En el árbol de contenido en el panel izquierdo de la biblioteca de MSDN, vaya al siguiente tema de Ayuda:
  \Data Access
    \Microsoft Data Access Components
      \ADO
        \SDK Documentation
          \Microsoft ActiveX Data Objects (ADO)
            \ADO Programmer's Guide
				
Para obtener información adicional, haga clic en los números de artículo correspondientes para verlos en Microsoft Knowledge Base:
225048INFORMACIÓN: Problemas migración de DAO/Jet a ADO y Jet
304322ACC2002: Cómo usar ADOX para importar relaciones
230588Cómo vincular y actualizar vinculado tablas Jet mediante ADOX
279245REVISIÓN: Propiedades de columna predeterminado liquidación al establecer o comprobar valores utilizando ADOX a una base de datos de Access
304323ACC2002: Cómo usar ADOX para crear una consulta de paso a través SQL
275252ACC2000: Cómo crear una tabla con tipos de datos Jet a través de ADOX
252908Cómo crear una tabla con la clave principal mediante ADOX
230501Cómo compactar base de datos Microsoft Access a través de ADO

Propiedades

Id. de artículo: 321328 - Última revisión: jueves, 27 de febrero de 2014 - Versión: 1.4
La información de este artículo se refiere a:
  • Microsoft Visual Studio 6.0 Enterprise
  • Microsoft ActiveX Data Objects 2.7
Palabras clave: 
kbnosurvey kbarchive kbmt kbfile kbhowto KB321328 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 321328

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com