[英]Open DAO recordset from Access using C++ builder 2010
inte.netz 上缺少有关使用 DAO 与 C++ 的信息,这让我感到非常恼火。 因为我有东西要修,所以我不得不摆弄一下,我正在考虑跳出 windows :)
我找到的唯一示例是 VB6、VB.Net 和 VBA 相关。 我试图将它们应用到 C++ 并得到以下结果
...
WideString sqlQuery = WideString(
"SELECT * "\
"FROM NODES "\
"WHERE ID = " + IntToStr(NODE_ID));
Dao_2k::RecordsetPtr pNewRecord;
pNewRecord = m_dbDatabase->OpenRecordset(sqlQuery.c_bstr(), OleVariant(RecordsetTypeEnum::dbOpenDynaset));
...
但它只是不想工作。 我首先尝试仅使用 sql 查询,然后我添加了dbOpenDynaset
设置并尝试其他设置。 但是执行只是停止了。 我认为 C++ 中的OpenRecordset
function 可能需要更多变量,但 IDE 没有关于它的文档,所以我有点摸不着头脑。
select 实际上将包含一些连接,但我将其剥离以查看是否是问题所在。 但是这个简单和更复杂的查询都在 Access 中执行。
我使用VB教程和其他一些资料中描述的一些原理使它起作用。 这样的事情应该起作用。
WideString sqlQuery = WideString(
"SELECT * FROM NODES "\
"WHERE ID = " + IntToStr(NODE_ID));
Dao_2k::RecordsetPtr pRecord;
pRecord = m_dbDatabase->OpenRecordset(sqlQuery.c_bstr(), OleVariant(RecordsetTypeEnum::dbOpenDynaset));
Dao_2k::FieldsPtr fs;
fs = pEntryRecord->get_Fields();
Dao_2k::FieldPtr nodeIdField;
nodeIdField = fs->get_Item(OleVariant(0));
尽管Access在处理SQL语法方面并不可怕。 JOINS需要一组奇怪的括号,而我还无法使其成为UNION :)
在花了几天时间寻找将 DAO 与 C++ 一起使用的方法之后,我能找到的所有示例都使用 Microsoft C++ 编译器。 但是,我想要一些 MingW 也可以编译的东西。 经过多次搜索,我发现了一个用于 com DLL 的包装器,该 DLL 被 VB6 用于 C++,名为 Disphelper。 我花了几个小时试图弄清楚如何使用此 Disphelper 访问 DAO object 但最后,我设法让它工作,这是打开和读取 MS Access 数据库的代码(我将其命名为 Test.mdb 并包含 4 个简单的列)。 我认为任何人都可以轻松地将其转换为自己的数据库。 您可以从 Disphelper 档案中获取文件Disphelper.h
和Disphelper.c
。
#include "disphelper.h"
#include <stdio.h>
#include <wchar.h>
int main(void)
{
dhInitialize(TRUE);
dhToggleExceptions(TRUE);
DISPATCH_OBJ(objDBEngine);
DISPATCH_OBJ(objWORKSpace);
DISPATCH_OBJ(objDATABase);
DISPATCH_OBJ(objRECORDSet);
int bEOF;
LPWSTR a,b,c;
int d;
dhCreateObject(L"DAO.DBEngine.120", NULL, &objDBEngine);
dhGetValue(L"%o",&objWORKSpace,objDBEngine,L".Workspaces(%d)",0);
dhGetValue(L"%o",&objDATABase,objWORKSpace,L".OpenDatabase(%s)","C:/Test.mdb");
dhGetValue(L"%o",&objRECORDSet,objDATABase, L".OpenRecordset(%s,dbOpenDynaset)", "SELECT * FROM Details");
while (SUCCEEDED(dhGetValue(L"%b", &bEOF, objRECORDSet, L".EOF")) && !bEOF)
{
dhGetValue(L"%d", &d,objRECORDSet, L".Fields(%s)", "ID");
dhGetValue(L"%s", &a,objRECORDSet, L".Fields(%s)", "Name");
dhGetValue(L"%s", &b,objRECORDSet, L".Fields(%s)", "Surname");
dhGetValue(L"%s", &c,objRECORDSet, L".Fields(%s)", "DOB");
printf("ID: %d\nName: %s\nSurname: %s\nDOB: %s\n\n",d,a,b,c);
dhCallMethod(objRECORDSet, L".MoveNext");
}
SAFE_RELEASE(objRECORDSet);
SAFE_RELEASE(objDATABase);
SAFE_RELEASE(objWORKSpace);
SAFE_RELEASE(objDBEngine);
printf("Press ENTER to exit...\n");
getchar();
dhUninitialize(TRUE);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.