gpt4 book ai didi

c++ - 直接 Access 旧的 MDB 文件

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:53 29 4
gpt4 key购买 nike

我有一个 C++ (MFC) 应用程序。我的客户需要我添加一个功能来读取一些数据文件。

这些数据文件是 MDB 文件。它们似乎适用于旧版本的 Microsoft Access(可能是 2007 年之前的版本,但我无法确认这一点)。

如果我能找到足够的格式文档,我准备直接阅读这些文件。我也很想听听旧的 ODBC 或其他可以处理这些旧文件的类似工具。但是一个要求是我们不需要安装一堆额外的软件。理想情况下,我可以从 C++ 中完成这一切。

我能否就如何 Access 这些数据获得一些建议?格式文档在哪里?除了自己直接阅读之外,还有哪些其他选择?

注意:This article呈现 MDB 文件的布局;但是,它似乎与我正在使用的文件的内容不匹配。

最佳答案

我使用 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 位 ...

它有:

  • 64ACCDB Microsoft 数据库驱动程序
  • 32MDB Microsoft 数据库驱动程序

没有 64 位 MDB 驱动程序。因此,如果您想使用 MDB 数据库,请确保您在 32 位模式下构建您的应用程序。

关于c++ - 直接 Access 旧的 MDB 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40986630/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com