我有一个C ++(MFC)应用程序。我的客户需要我添加一个功能来读取一些数据文件。
这些数据文件是MDB文件。它们似乎是旧版本的Microsoft Access(可能是2007年之前的版本,但我无法确认)。
如果我能找到足够的格式文档,我可以直接阅读这些文件。我也听说过较旧的ODBC或其他类似的工具,可以使用这些旧文件。但要求是我们不需要安装一堆额外的软件。理想情况下,我可以用C ++完成所有这些。
我可以获得一些关于如何访问此数据的建议吗?格式文档在哪里以及除了直接自己阅读之外还有哪些其他选项?
注意:This article显示MDB文件的布局;但是,它似乎与我正在使用的文件的内容不匹配。
答案 0 :(得分:2)
您需要阅读MS Access .mdb文件,只需在目标PC /服务器上安装 MDAC (Microsoft数据访问组件)即可。 Vista / Windows 7/8 / 8.1 / 10等所有现代操作系统都预先安装了此组件,以方便您使用。如果您必须定位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);
}
答案 1 :(得分:2)
我将CDatabase
与Microsoft Jet驱动程序一起使用以连接到MDB数据库。
我找到了正确的驱动程序:
// 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;
}
如果您知道要使用哪个驱动程序,那就使用它。然后打开你的数据库:
// 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);
}
}
但是一句警告 ....我用自己的电脑作为例子......
我的电脑是Windows 10 64位......
它有:
没有64位MDB驱动程序。因此,如果您想使用MDB数据库,请确保以32位模式构建应用程序。