Como usar o ADOX do C++ para copiar um arquivo de banco de dados Jet atual para um banco de dados formato mais recente do Jet 4.0

Traduções deste artigo Traduções deste artigo
ID do artigo: 321328 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Sumário

Este artigo demonstra como usar o ActiveX Data Objects extensões para Data Definition Language e Security (ADOX) com o Visual C++ para criar um banco de dados Jet novo usando dados do banco de um antigo formatado dados Jet. Este artigo também demonstra técnicas a seguir são usadas em ADOX com o Visual C++:
  • Como usar ADOX com o Visual C++ para criar um banco de dados do Jet
  • Como obter a lista de tabelas em um banco de dados
  • Como obter os metadados de uma tabela, incluindo colunas e tipos
  • Como usar o método append do ADOX para criar tabelas e colunas
  • Como usar propriedades de específicas do provedor do Jet OLE DB para criar uma tabela vinculada
  • Como usar o ADO em combinação com ADOX para copiar dados de um banco de dados para outro
  • Como excluir uma tabela de um banco de dados do Jet

Mais Informações

Teste o método CompactDatabase do objeto do Jet Replication (JRO) revela que o método faz efectively não converter uma tabela para o Jet 4.0 formato se a tabela de origem for no Access 2.0 ou no formato do Access 95. Se uma tabela que é gerada pelo Access 2.0 ou pelo Access 95 é convertida em formato do Jet 4.0 usando o método CompactDatabase do objeto JRO, Access 2000 ou Access 2002 não é possível abrir com êxito o banco de dados. Esse problema está ainda sob investigação da Microsoft. Observe que objetos JRO destinavam-se para trabalhar somente com o Jet 4.0 e Jet 3.5 x bancos de dados.

Para converter o banco de antigo dados do Jet (anteriores ao formato do Jet 3.5), use ADOX para criar um novo banco de dados 4.0 formato e copiar todas as tabelas. O código a seguir demonstra como fazer isso. Isso é um exemplo simples e não aborda vários cenários especiais, como chaves primárias, índices, propriedades e relações. O exemplo copia apenas tabelas e não copia outros objetos do banco de dados de origem. Para obter informações adicionais sobre essas técnicas, consulte a documentação do ADOX no site MSDN Library.

Salvar o código a seguir em um projeto de C++ e, em seguida, criar o projeto:

Observação : não é necessário alterar nada no código, exceto para os caminhos em de # import e seqüências de conexão.
#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;
       }
}
				

Referências

Para obter mais informações, visite a MSDN Library no site da Microsoft:
http://msdn2.microsoft.com/en-us/library/default.aspx
Na árvore do conteúdo no painel esquerdo da biblioteca MSDN, vá para o seguinte tópico da Ajuda:
  \Data Access
    \Microsoft Data Access Components
      \ADO
        \SDK Documentation
          \Microsoft ActiveX Data Objects (ADO)
            \ADO Programmer's Guide
				
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
225048INFO: Problemas migração do DAO/Jet para ADO/Jet
304322ACC2002: Como utilizar o ADOX para importar relações
230588Como vincular e atualizar vinculado Jet tabelas usando ADOX
279245CORRECÇÃO: Propriedades de coluna padrão desmarcada ao definir ou verificar valores usando ADOX para um banco de dados do Access
304323ACC2002: Como utilizar ADOX para criar uma consulta de passagem SQL
275252ACC2000: Como criar uma tabela com tipos de dados Jet via ADOX
252908Como criar uma tabela com chave primária por meio do ADOX
230501Como Compactar banco de dados Microsoft Access através de ADO

Propriedades

ID do artigo: 321328 - Última revisão: quinta-feira, 27 de fevereiro de 2014 - Revisão: 1.4
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft ActiveX Data Objects 2.7
Palavras-chave: 
kbnosurvey kbarchive kbmt kbfile kbhowto KB321328 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 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