如何使用Visual C++(非C++/CLI)处理.mdb数据库

How to work with .mdb databases using Visual C++ (Not C++/CLI)?

本文关键字:C++ 处理 mdb 数据库 CLI 何使用 Visual      更新时间:2023-10-16

我目前正变得疯狂,因为我无法找到以下任务的解决方案:

我想

  • 从MS Access.mdb数据库内的表中读取数据
  • 操纵所述数据,以及
  • 将其写回同一数据库
  • 使用Visual C++完成所有这些操作(而不是使用CLI,因为我必须调整大量现有的代码(

为此,我尝试使用此处提供的解决方案,该解决方案使用ADO来处理Northwind 2007.accdb数据库(他们访问.accdb而不是.mdb应该不会有问题,对吧?(。我将那里给出的代码复制到VS2017 x64中的一个空项目中,只调整了Northwind数据库的源路径,并更改了以下行

hr = pConn->Open(bstrConnect, "admin", "", ADODB::adConnectUnspecified);

HRESULT hr = pConn->Open(bstrConnect, "admin", "", ADODB::adConnectUnspecified);

因为否则就没有定义hr。(这是错误的调整吗?(

我安装了MS Access 2016 64位版本。

现在这是我的代码:

#import <C:\Program Files\Common Files\System\ado\msado15.dll> rename( "EOF", "AdoNSEOF" )
#include <iostream>
using namespace std;
int main() {
_bstr_t bstrConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Downloads\Northwind 2007.accdb;";
// Shows the Data Access Method used in this sample.
const char* DAM = "ADO";
ADODB::_ConnectionPtr pConn("ADODB.Connection");
HRESULT hr = pConn->Open(bstrConnect, "admin", "", ADODB::adConnectUnspecified);
if (SUCCEEDED(hr)) {
cout << DAM << ": Successfully connected to database. Data source name:n  "
<< pConn->GetConnectionString() << endl;
// Prepare SQL query.
_bstr_t query = "SELECT Customers.[Company], Customers.[First Name] FROM Customers;";
cout << DAM << ": SQL query:n  " << query << endl;
// Excecute the query and create a record set.
ADODB::_RecordsetPtr pRS("ADODB.Recordset");
hr = pRS->Open(query,
_variant_t((IDispatch *)pConn, true),
ADODB::adOpenUnspecified,
ADODB::adLockUnspecified,
ADODB::adCmdText);
if (SUCCEEDED(hr)) {
cout << DAM << ": Retrieve schema info for the given result set: " << endl;
ADODB::Fields* pFields = NULL;
hr = pRS->get_Fields(&pFields);
if (SUCCEEDED(hr) && pFields && pFields->GetCount() > 0) {
for (long nIndex = 0; nIndex < pFields->GetCount(); nIndex++) {
cout << " | " << _bstr_t(pFields->GetItem(nIndex)->GetName());
}
cout << endl;
} else {
cout << DAM << ": Error: Number of fields in the result set is 0." << endl;
}
cout << DAM << ": Fetch the actual data: " << endl;
int rowCount = 0;
while (!pRS->AdoNSEOF) {
for (long nIndex = 0; nIndex < pFields->GetCount(); nIndex++) {
cout << " | " << _bstr_t(pFields->GetItem(nIndex)->GetValue());
}
cout << endl;
pRS->MoveNext();
rowCount++;
}
cout << DAM << ": Total Row Count: " << rowCount << endl;
}
pRS->Close();
pConn->Close();
cout << DAM << ": Cleanup. Done." << endl;
} else {
cout << DAM << ": Unable to connect to data source: " << bstrConnect << endl;
}

return 1;
}

该代码进行了编译,但在import指令生成的msado15.2tlh中,显示了52个错误E0102(对于不同的行,但总是相同的错误(,描述为:枚举类型的Forward声明不符合标准(粗略翻译,我认为它理解了(。(作为一个附带问题:当使用import指令时,我必须在项目属性中的哪里链接msado15.dll路径?我将C:\Program Files\Common Files\System\ado路径添加到Include目录,对吗?(

此外,运行.exe或在Powershell中执行它都不起作用,Windows会发出消息">MYPROGRAM.exe不再运行",只有关闭程序的选项。

我做错了什么?我是否选择了错误的方法来处理在我看来应该很容易解决的任务(在Visual C++中读一个该死的表不应该那么难吗(

有没有更好的方法来使用.mdb数据库(例如使用DAO、ODBC或OLE DB(,有没有可以使用的最新代码示例,或者有一个很好的文档/教程,逐步解释如何连接到数据库,并显示如何读取和写入数据库?

第1版:A_Singh7提供了以下解决方案:

  1. 将ghr定义为全局变量
  2. 将主函数的返回值更改为0
  3. 使用此处提供的代码

前两个解决方案没有奏效,所以我用解决方案3中的代码进行了尝试。这是我收到的Powershell中的输出:

ADO: Successfully connected to database. Data source name:
Provider=Microsoft.ACE.OLEDB.12.0;User ID=admin;Data Source=C:UsersPublicDownloadsNorthwind 2007.accdb;Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Bypass UserInfo Validation=False;Jet OLEDB:Limited DB Caching=False;Jet OLEDB:Bypass ChoiceField Validation=False;
ADO: SQL query
SELECT Customers.[Company], Customers.[First Name] FROM Customers;

之后,.exe不幸崩溃,我仍然要弄清楚原因。尽管如此,建立与数据库的连接似乎是可行的,这是我遇到的主要问题。

尝试将hr声明为全局变量。就像

#include <iostream>
using namespace std;
HRESULT hr;
int main ()
{
// your code 
// the line hr = pConn->Open(bstrConnect, "admin", "", ADODB::adConnectUnspecified); should remain as it is 
}

首先尝试以上操作,如果不起作用,请尝试更改return 1;返回0;。如果这甚至不起作用,请参阅此处:http://msdn.microsoft.com/en-us/library/cc811599.aspx之后请从这里寻求帮助:使用Visual Studio 2008使用C++连接到MS Access数据库在这里,您只需要包含stafdx.h文件作为头,就可以使代码完美地工作。