如何使用 C + + 的 ADOX 將舊的 Jet 資料庫檔案複製到較新的 Jet 4.0 格式資料庫

文章翻譯 文章翻譯
文章編號: 321328 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

結論

本文將告訴您,如何使用 ActiveX 資料物件延伸的資料定義語言和安全性 (ADOX) 與 Visual C++ 建立新的 Jet 資料庫使用較舊的格式化 Jet 資料庫的資料。 本文也將示範 ADOX Visual C++ 中,使用下列技術:
  • 如何使用 Visual C++ 的 ADOX 建立 Jet 資料庫
  • 如何取得資料庫中的資料表清單
  • 如何取得包括資料行和型別資料表的中繼資料
  • 如何使用 ADOX 附加 方法來建立資料表和資料行
  • 如何使用 Jet OLE DB 提供者專用的屬性來建立連結的資料表
  • 如何 ADOX 搭配使用 ADO 來將資料從一個資料庫複製到另一個
  • 如何從 Jet 資料庫刪除資料表

其他相關資訊

將測試 CompactDatabase 方法 Jet 複寫物件 (JRO) 則方法不 efectively 揭露表格轉換為 Jet 4.0 格式如果來源資料表是在 Access 2.0 或在 Access 95 格式。如果 Access 2.0 或 Access 95,就會產生的資料表會轉換成使用 JRO 物件 CompactDatabase 方法,Jet 4.0 格式,Access 2000 或 Access 2002 無法成功地開啟資料庫。這個問題是仍在 Microsoft 的研究。請注意 JRO 物件而原本要處理只與 Jet 4.0 與 Jet 3.5 x 格式的資料庫。

若要將您舊的 Jet 資料庫 (早於 Jet 3.5 格式) 使用 ADOX 建立新的 4.0 版格式資料庫,並複製所有的資料表。下列程式碼會示範如何執行這項操作。這是簡單的範例,而且不能解決數個特殊的案例,例如主索引鍵、 索引、 內容和關係。這個範例只會複製資料表並不會複製其他物件從來源資料庫。如需有關這些技術的詳細資訊,請參閱 MSDN 程式庫網站上的 ADOX 文件。

在 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 程式庫在下列 Microsoft 網站:
http://msdn2.microsoft.com/en-us/library/default.aspx
在 [在 MSDN 程式庫] 的左窗格中 [內容] 樹狀目錄,瀏覽到下列的 [說明] 主題:
  \Data Access
    \Microsoft Data Access Components
      \ADO
        \SDK Documentation
          \Microsoft ActiveX Data Objects (ADO)
            \ADO Programmer's Guide
				
如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
225048從 DAO/Jet 遷移至 ADO/Jet 的資訊: 問題
304322ACC2002: 如何使用 ADOX 匯入的關聯性
230588如何連結和重新整理連結使用 ADOX Jet 資料表
279245FIX: 預設資料行屬性時,清除您設定或使用 ADOX Access 資料庫,以檢查值
304323ACC2002: 如何使用 ADOX 來建立 SQL 通過查詢
275252ACC2000: 如何透過 ADOX Jet 資料類型以建立資料表
252908如何建立具有 ADOX 透過主索引鍵的資料表
230501如何透過 ADO 的 Microsoft Access 資料庫壓縮

屬性

文章編號: 321328 - 上次校閱: 2014年2月27日 - 版次: 1.4
這篇文章中的資訊適用於:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft ActiveX Data Objects 2.7
關鍵字:?
kbnosurvey kbarchive kbmt kbfile kbhowto KB321328 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:321328
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

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