Comment faire pour utiliser ADOX à partir de C++ pour copier un fichier de base de données Jet ancien dans une base de données de format plus récente Jet 4.0

Traductions disponibles Traductions disponibles
Numéro d'article: 321328 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Résumé

Cet article explique comment utiliser ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) avec Visual C++ pour créer une nouvelle base de données Jet à l'aide des données d'une ancienne base de données Jet mis en forme. Cet article explique également les techniques suivantes qui sont utilisés dans ADOX avec Visual C++ :
  • Comment faire pour utiliser ADOX avec Visual C++ pour créer une base de données Jet
  • Comment faire pour obtenir la liste des tables dans une base de données
  • Comment faire pour obtenir les métadonnées d'un tableau, y compris les colonnes et les types
  • Comment utiliser la méthode Append D'ADOX pour créer des tables et colonnes
  • Comment utiliser les propriétés spécifiques au fournisseur Jet OLE DB pour créer une table attachée
  • Comment utiliser ADO en combinaison avec ADOX pour copier des données d'une base de données vers un autre
  • Comment supprimer une table d'une base de données Jet

Plus d'informations

Test de la méthode CompactDatabase de Jet réplication, objet (JRO) révèle que la méthode effectue efectively pas convertir un tableau format Jet 4.0 si la table source se trouve au Access 2.0 ou au format Access 95. Si une table qui est générée par Access 2.0 ou Access 95 est convertie au format Jet 4.0 avec la méthode CompactDatabase de l'objet JRO, Access 2000 ou Access 2002 ne peut pas correctement ouvrir la base de données. Ce problème est toujours étude chez Microsoft. Notez qu'objets JRO a été conçues pour fonctionner uniquement avec Jet 4.0 et Jet 3.5 x bases de données de format.

Pour convertir votre base d'ancienne données Jet (antérieure format Jet 3.5), utilisez ADOX pour créer une nouvelle base de données 4.0 format et copier toutes les tables. Le code suivant montre comment procéder. Il s'agit d'un exemple simple et ne traite pas plusieurs scénarios spéciaux tels que les clés primaires, index, propriétés et relations. L'exemple de copie uniquement les tables et ne copient pas les autres objets à partir de la base de données source. Pour plus d'informations sur ces techniques, consultez la documentation ADOX sur le site Web de la bibliothèque MSDN.

Enregistrer le code suivant dans un projet C++, puis puis générez le projet :

Remarque : vous évite de devoir rien modifier dans le code, sauf pour les chemins d'accès sur les chaînes de connexion et # Import.
#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;
       }
}
				

Références

Pour plus d'informations, visitez la bibliothèque MSDN au site Web de Microsoft à l'adresse suivante :
http://msdn2.microsoft.com/en-us/library/default.aspx
Dans l'arborescence contenus dans le volet gauche de la bibliothèque MSDN, accédez à la rubrique suivante :
  \Data Access
    \Microsoft Data Access Components
      \ADO
        \SDK Documentation
          \Microsoft ActiveX Data Objects (ADO)
            \ADO Programmer's Guide
				
Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :
225048 INFO : problèmes migration à partir de DAO/Jet à ADO/Jet
304322 ACC2002 : Comment faire pour utiliser ADOX pour importer des relations
230588 Comment lier et Actualiser liées tables Jet à l'aide D'ADOX
279245 CORRECTIF : les propriétés de colonne par défaut désactivée lorsque vous définir ou vérifier les valeurs à l'aide D'ADOX à une base de données Access
304323 ACC2002 : comment utiliser ADOX pour créer une requête SQL directe
275252 ACC2000 : Comment faire pour créer une table avec les types de données Jet par ADOX
252908 Comment faire pour créer une table avec clé primaire par ADOX
230501 Comment faire pour compacter la base de données Microsoft Access via ADO

Propriétés

Numéro d'article: 321328 - Dernière mise à jour: mercredi 26 février 2014 - Version: 1.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft ActiveX Data Objects 2.7
Mots-clés : 
kbnosurvey kbarchive kbmt kbfile kbhowto KB321328 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 321328
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

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