Použití ADOX z C++ kopírování staré databázový soubor Jet novější formát databáze Jet 4.0

Překlady článku Překlady článku
ID článku: 321328 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Tento článek demonstruje použití rozšíření ActiveX Data Objects pro Data Definition Language a Security (ADOX) s Visual C++ pro vytvoření nové databáze Jet pomocí dat ze starších formátovaný databáze Jet. Tento článek také znázorňuje následující techniky, které jsou použity v ADOX s Visual C++:
  • Jak vytvořit databázi Jet pomocí ADOX s Visual C++
  • Jak získat seznam tabulek v databázi
  • Jak získat metadata tabulky včetně sloupců a typů
  • Jak použít metoda append ADOX k vytvoření tabulek a sloupců
  • Jak použít vlastnosti specifické pro zprostředkovatele Jet OLE DB k vytvoření propojené tabulky
  • Jak používat ADO v kombinaci s ADOX kopírování dat z jedné databáze
  • Jak odstranit tabulku z databáze Jet

Další informace

Testování metoda CompactDatabase z JRO (Jet Replication Object) ukazující metoda ani není efectively převést tabulku formát Jet 4.0 Pokud zdrojová tabulka je v Access 2.0 nebo ve formátu Access 95. Pokud tabulka je generována podle Access 2.0 nebo Access 95 převedeny na formát Jet 4.0 pomocí metody CompactDatabase objektů JRO, 2000 nebo Access 2002 nelze úspěšně otevřít databázi. Tento problém je stále pod šetření společnosti Microsoft. Všimněte si, že objekty JRO byly určeny pracovat pouze s Jet 4.0 a Jet 3.5 x formátu databáze.

Převést staré databáze Jet (starší než formát Jet 3.5), použijte ADOX vytvořit novou databázi 4.0 formátu a zkopírovat všechny tabulky. Následující kód ukazuje, jak to provést. Toto je jednoduché ukázkové a neřeší zvláštní několik scénářů, jako je například primární klíče, indexy, vlastnosti a vztahy. Ukázkové zkopíruje pouze tabulky a jiné objekty nebude kopírovat ze zdrojové databáze. Další informace o těchto technikách naleznete v dokumentaci ADOX na webu MSDN Library.

Uložit následující kód v projektu C++ a vytváření projektu:

Poznámka: nemáte změnit cokoli v kódu pro kromě cesty na řetězce #import a připojení.
#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;
       }
}
				

Odkazy

Další informace naleznete na následující web knihovny MSDN:
http://msdn2.microsoft.com/en-us/library/default.aspx
Ve stromu obsahu v levém podokně knihovny MSDN vyhledejte následující téma nápovědy:
  \Data Access
    \Microsoft Data Access Components
      \ADO
        \SDK Documentation
          \Microsoft ActiveX Data Objects (ADO)
            \ADO Programmer's Guide
				
Další informace naleznete v následujících článcích znalostní báze Microsoft Knowledge Base:
225048INFORMACE: Migrace z DAO/Jet ADO/Jet problémy
304322ACC2002: Jak používat ADOX importovat relace
230588Postup propojení a aktualizovat propojený tabulky Jet použití ADOX
279245Oprava: Při nastavení nebo kontrola hodnoty pomocí ADOX databáze Access zrušeno vlastnosti výchozí sloupce
304323ACC2002: Jak používat ADOX vytvoření PŘEDÁVACÍ dotaz
275252ACC2000: Jak vytvořit tabulky s typy dat Jet prostřednictvím ADOX
252908Jak vytvořit tabulku s primárním klíčem through ADOX
230501Jak komprimovat databáze bude prostřednictvím ADO

Vlastnosti

ID článku: 321328 - Poslední aktualizace: 28. února 2014 - Revize: 1.4
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft ActiveX Data Objects 2.7
Klíčová slova: 
kbnosurvey kbarchive kbmt kbfile kbhowto KB321328 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:321328

Dejte nám zpětnou vazbu

 

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