如何使用Visual C++(非C++/CLI)处理.mdb数据库
How to work with .mdb databases using Visual C++ (Not C++/CLI)?
我目前正变得疯狂,因为我无法找到以下任务的解决方案:
我想
- 从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提供了以下解决方案:
- 将ghr定义为全局变量
- 将主函数的返回值更改为0
- 使用此处提供的代码
前两个解决方案没有奏效,所以我用解决方案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文件作为头,就可以使代码完美地工作。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在多个核心中处理一个HTTP请求