Como utilizar ADOX do C++ para copiar um ficheiro de base de dados Jet antiga para uma base de dados mais recente do Jet 4.0 Formatar

Traduções de Artigos Traduções de Artigos
Artigo: 321328 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Sumário

Este artigo demonstra como utilizar o ActiveX Data Objects extensões para linguagem de definição de dados e Security (ADOX) com o Visual C++ para criar uma base de dados Jet novo utilizando dados de uma base de dados Jet mais antigo formatado. Este artigo também demonstra as seguintes técnicas utilizadas na ADOX com o Visual C++:
  • Como utilizar ADOX com o Visual C++ para criar uma base de dados Jet
  • Como obter a lista de tabelas numa base de dados
  • Como obter os metadados de uma tabela, incluindo colunas e tipos de
  • Como utilizar o método append do ADOX para criar tabelas e colunas
  • Como utilizar propriedades de específicas do fornecedor OLE DB do Jet para criar uma tabela ligada
  • Como utilizar ADO em combinação com ADOX para copiar dados de uma base de dados para outra
  • Como eliminar uma tabela de uma base de dados Jet

Mais Informação

Testar o método CompactDatabase do Jet Replication Object (JRO) revela que o método não efectively não converter uma tabela para formato Jet 4.0 se a tabela de origem é no Access 2.0 ou no formato do Access 95. Se uma tabela que é gerada pelo Access 2.0 ou pelo Access 95 é convertida para formato Jet 4.0 utilizando o método CompactDatabase do objecto JRO, as Access 2000 ou Access 2002 não é possível com êxito abrir-se a base de dados. Este problema ainda está em investigação da Microsoft. Tenha em atenção que os objectos JRO deveriam para trabalhar apenas com o Jet 4.0 e o Jet 3.5 x bases de dados do formato.

Para converter a base de antigo dados Jet (anterior ao formato Jet 3.5), utilize ADOX para criar uma nova base de dados 4.0 formato e copiar todas as tabelas. O seguinte código demonstra como efectuar este procedimento. Este é um exemplo simples e não corrige vários cenários especiais tais como chaves primárias, índices, propriedades e relações. O exemplo copia apenas a tabelas e não copia outros objectos da base de dados de origem. Para obter informações adicionais sobre estas técnicas, consulte a documentação de ADOX no site da Web da biblioteca MSDN.

Guarde o seguinte código num projecto do C++ e, em seguida, criar o projecto:

Nota : não é necessário alterar nada no código, excepto para os caminhos em cadeias #import e ligaçã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 mais informações, visite a MSDN Library no seguinte Web site da Microsoft:
http://msdn2.microsoft.com/en-us/library/default.aspx
Na árvore de conteúdo no painel da esquerda da MSDN Library, navegue para o seguinte tópico de 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 de artigo existentes abaixo para visualizar os artigos na Microsoft Knowledge Base:
225048INFO: Problemas migrar do DAO/Jet para o ADO/Jet
304322ACC2002: Como utilizar ADOX para importar relações
230588Como ligar e actualizar associada tabelas Jet utilizar ADOX
279245CORRECÇÃO: Limpa de propriedades da coluna predefinido quando definir ou verificar valores utilizando ADOX a uma base de dados Access
304323ACC2002: Como utilizar ADOX para criar uma consulta pass-through SQL
275252ACC2000: Como criar uma tabela com tipos de dados Jet através de ADOX
252908Como criar uma tabela com a chave principal através de ADOX
230501Como Compactar base de dados do Microsoft Access através de ADO

Propriedades

Artigo: 321328 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 321328

Submeter comentários

 

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