2016-12-06 11 views
2

私はC++(MFC)アプリケーションを持っています。私の顧客は、一部のデータファイルから読み取る機能を追加する必要があります。古いMDBファイルに直接アクセスする

これらのデータファイルはMDBファイルです。彼らは古いバージョンのMicrosoft Access(おそらく2007年以前のバージョンだが、それを確認できていない)のようだ。

私は彼らの書式に関する十分な文書を見つけることができれば、これらのファイルを直接読んでいます。また、これらの古いファイルで動作する古いODBCや他の同様のツールについても聞いています。しかし、追加のソフトウェアをインストールする必要はありません。理想的には、私はこれをC++からすべて行うことができます。

私はこのデータにどのようにアクセスできるかについていくつかの提案を得ることができますか?書式設定書類はどこにありますか、それを自分で直接読める以外のオプションがありますか?

注:This articleはMDBファイルのレイアウトを表します。しかし、それは私が作業しているファイルの内容と一致していないようです。

+0

Visual StudioからこのDBに正常に接続できますか? ( 'Tools - > Connect to Database')もしそうなら、ドライバがこの(古い)形式で利用可能であることを示すよい表示になります。 –

+0

絶対にありません。私のコンピュータにはAccessがインストールされていますが、私のシステムにはこれらの古いMDBファイルを読むことのできるソフトウェアはありません。 –

+0

よろしく!アクセスできない? –

答えて

2

私はMDBデータベースに接続するために、Microsoft JetのドライバでCDatabaseを使用しています。

私はこのような正しいドライバを見つけます。あなたが使用したいドライバを知っている場合は、単にそれを使用、

// We now iterate the JET drivers list and locate a valid MDB driver 
CString CPTSDatabase::GetJETDriver(bool bAccDbMode) 
{ 
    CString   strDriver; 
    CString   strName, strNameLower, strValue; 
    CString   strDefaultDriver = _T("Microsoft Access Driver (*.mdb)"); 
    CString   strDBType = _T("(*.mdb)"); 
    CStringArray aryStrDrivers; 
    TCHAR   szBuf[2001]; 
    WORD   cbBufMax = 2000; 
    WORD   cbBufOut; 
    TCHAR   *pszBuf = szBuf; 

    if (SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut)) 
    { 
#ifdef _WIN64 
     strDefaultDriver = _T("Microsoft Access Driver (*.mdb, *.accdb)"); 
     strDBType = _T("(*.mdb, *.accdb)"); 
#else 
     if (bAccDbMode) 
     { 
      strDefaultDriver = _T("Microsoft Access Driver (*.mdb, *.accdb)"); 
      strDBType = _T("(*.mdb, *.accdb)"); 
     } 
#endif 
     do 
     { 
      strName = CString(pszBuf); 
      strNameLower = strName; 
      strNameLower.MakeLower(); 

      if (strNameLower.Find(strDBType) != -1) 
      { 
       aryStrDrivers.Add(strName); 
       if (strName.CollateNoCase(strDefaultDriver) == 0) 
       { 
        strDriver = strName; 
        break; 
       } 
      } 

      pszBuf = _tcschr(pszBuf, _T('\0')) + 1; 
     } while (pszBuf[1] != _T('\0')); 

     if (strDriver.IsEmpty() && aryStrDrivers.GetSize() > 0) 
     { 
      // Try and use the first MDB driver we found 
      strDriver = aryStrDrivers.GetAt(0); 
     } 
    } 

    // Make a note of the driver 
    AfxGetApp()->WriteProfileString(_T("Options"), _T("JET Connection Driver"), strDriver); 

    return strDriver; 
} 

を。

マイコンピュータは、Windows 10 64ビットです....

// Opens the database (gets closed in destructor) 
void CPTSDatabase::OpenDatabase(bool bAccDbMode, CString strPassword) 
{ 
    CString  strDBConnectString; 
    CString  strDriver; 

    if (m_dbDatabase.IsOpen()) 
     return; 

    if (DatabaseExist(m_strDatabasePath)) 
    { 
     // AJT v10.5.0 Take into account the DB mode 
     strDriver = GetJETDriver(bAccDbMode); 
     // Take into account the DB password (decrypted!) 
     strDBConnectString.Format(_T("Driver={%s};DBQ=%s;Pwd=%s"), 
      strDriver, m_strDatabasePath, 
      CPTSTools::DecryptDatabasePassword(strPassword)); 

     m_dbDatabase.OpenEx(strDBConnectString, CDatabase::noOdbcDialog); 
    } 
} 

しかし警告の言葉....そして私は例として、自分のコンピュータを使用して...:次に、あなたのデータベースを開きます

それはあります

  • ビットACCDBマイクロソフトDATAB ASEドライバ
  • ビットMDBマイクロソフトのデータベースドライバ

なし64ビットMDBドライバはありません。したがって、MDBデータベースで作業したい場合は、アプリケーションを32ビットモードで構築するようにしてください。

+1

これは役に立ちました、ありがとう。いくつか試行錯誤して、私はWindows 10マシンで作業することができました。クライアントにもこれらのドライバがあることを確認するためにいくつかのテストが必要になります。アプリは古くて、すでに32ビットだったので、私はそこに保管しておくと思います。 –

1

あなたはMS Accessの.MDBファイルを読むために必要なのはMDAC(Microsoftデータアクセスコンポーネント)ターゲットPC /サーバにインストールされています。 Vista/Windows 7/8/8.1/10のような最新のOSには、このコンポーネントがあらかじめインストールされています。 XPをターゲットにする必要がある場合は、MSサイトからこのコンポーネントをダウンロードできます。また、InstallShieldには、アプリケーションのインストーラをビルドする必要がある場合は、MDAC 2.7マージモジュールが付属しています。

あなたは、単にデータベースで動作するようにMFCクラスの標準セットを使用することができます。

CDatabase database; 
CString sDsn; 
CString sFile = _T("D:\\Projects\\DB\\Test.mdb"); 

// Build ODBC connection string 
sDsn.Format(_T("ODBC;DRIVER={%s};DSN='';DBQ=%s"), _T("MICROSOFT ACCESS DRIVER (*.mdb)"), sFile); 
try 
{ 
    // Open the database 
    database.Open(NULL, FALSE, FALSE, sDsn); 

    // Allocate the recordset 
    CRecordset recset(&database); 

    // Build the SQL statement 
    CString sSqlString = _T("SELECT Field1, Field2 from MyTable"); 

    // Execute the query 
    recset.Open(CRecordset::forwardOnly, sSqlString, CRecordset::readOnly); 

    // Loop through each record 
    while(!recset.IsEOF()) 
    { 
     // Copy each column into a variable 
     CString sField1; 
     CString sField2; 
     recset.GetFieldValue(_T("Field1"), sField1); 
     recset.GetFieldValue(_T("Field2"), sField2); 

     // goto next record 
     recset.MoveNext(); 
    } 
    // Close the database 
    database.Close(); 
} 
catch(CDBException* e) 
{ 
    // If a database exception occured, show error msg 
    AfxMessageBox(_T("Database error: ") + e->m_strError); 
} 
関連する問題