繁体   English   中英

使用 C++ builder 2010 从 Access 打开 DAO 记录集

[英]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.hDisphelper.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM