Как скопировать С помощью ADOX из C++ старый файл базы данных Jet для новой базы данных формата Jet 4.0

Переводы статьи Переводы статьи
Код статьи: 321328 - Vizualiza?i produsele pentru care se aplic? acest articol.
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Развернуть все | Свернуть все

Аннотация

В данной статье демонстрируется использование расширения объектов данных ActiveX для языка определения данных и безопасности (ADOX) с помощью Visual C++ для создания базы данных Jet с использованием данных из старых формате базы данных Jet. В этой статье также демонстрирует следующие приемы, используемые в ADOX с Visual C++:
  • Использование ADOX с Visual C++ для создания базы данных Jet
  • Получение списка таблиц в базе данных
  • Как получить метаданные из таблицы, включая столбцы и типы
  • Использование Добавление метод ADOX для создания таблиц и столбцов
  • Способы создания связанной таблицы с помощью свойства поставщика OLE DB для Jet
  • Использование ADO в сочетании с ADOX для копирования данных из одной базы данных
  • Как удалить таблицу из базы данных Jet

Дополнительная информация

Тестирование CompactDatabase Открывает метод объекта репликации Jet (JRO) не поддерживает метод efectively преобразование таблицы формата Jet 4.0, если исходной таблицы в Microsoft Access версии 2.0 или в формате Access 95. Если таблицы, созданный в Access версии 95 или Microsoft Access 2.0 преобразуется с использованием формата Jet 4.0 CompactDatabase метод объекта JRO Access 2000 или Access 2002 не удается успешно открыть базу данных. Данная проблема возникает в процессе исследования корпорации Майкрософт. Обратите внимание, что объекты JRO требовалось работать только с Jet 4.0 и Jet 3.5 x формат базы данных.

Для преобразования базы данных старой Jet (меньше формата Jet 3.5), с помощью ADOX для создания новой базы данных формата версии 4.0 и копирования всех таблиц. Следующий код демонстрирует это сделать. Это простой пример, не предусматривает несколько специальных сценариев, таких как первичные ключи, индексы, свойств и отношений. Пример копирует только таблицы и другие объекты не копируются из исходной базы данных. Для получения дополнительных сведений об этих методов в документации ADOX на сайте библиотеки MSDN.

Сохранить следующий код в проект C++, а затем построение проекта:

ПРИМЕЧАНИЕ: Вам нет необходимости изменять что-либо в коде, за исключением путей на # 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;
       }
}
				

Ссылки

Для получения дополнительных сведений посетите библиотеку MSDN на веб-узле корпорации Майкрософт:
английском языке)
В содержимое дерева в левой части библиотеки MSDN перейдите в следующий раздел справки:
  \Data Access
    \Microsoft Data Access Components
      \ADO
        \SDK Documentation
          \Microsoft ActiveX Data Objects (ADO)
            \ADO Programmer's Guide
				
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
225048 ИНФОРМАЦИЯ: Проблемы миграции от DAO/Jet ADO/Jet
304322 ACC2002: Как использовать ADOX Импорт отношений
230588 Как связать и обновить связанные таблицы Jet, с помощью ADOX
279245 ИСПРАВИТЬ: Свойства столбца по умолчанию установлен при установке или проверка значений с помощью ADOX для базы данных Access
304323 ACC2002: Как создать запрос к серверу с помощью ADOX
275252 ACC2000: Как создать таблицу с типами данных Jet через ADOX
252908 Создание таблицы с первичным ключом по ADOX
230501 Как сжать базу данных Microsoft Access через ADO

Свойства

Код статьи: 321328 - Последний отзыв: 21 февраля 2014 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft ActiveX Data Objects 2.7
Ключевые слова: 
kbnosurvey kbarchive kbfile kbhowto kbmt KB321328 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: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