【问题标题】:how to read records from ESE database using cpp如何使用 cpp 从 ESE 数据库中读取记录
【发布时间】:2015-02-13 02:38:57
【问题描述】:

我已经使用 JetOpenDatabase API 成功打开了 ESE 数据库。 要读取记录,我打开“MSysObjects”表并将当前索引设置为“RootObjects”。

这是我的代码(没有错误处理):

err = ::JetOpenTable(sessionID,dbID,"MSysObjects",NULL,0,0,&tableId);
err = ::JetSetCurrentIndex( sessionID, tableId, "RootObjects" );
err = ::JetMove( sessionID, tableId, JET_MoveFirst, 0 );

为了读取记录,我尝试使用 JetRetrieveColumns 函数从当前记录中检索多个列值。我也尝试过 JetRetrievedColumn 函数,但没有得到实际结果。

有人知道如何使用 cpp 从现有和未挂载的 ESE 数据库文件中读取记录吗?

【问题讨论】:

    标签: c++ esent extensible-storage-engine


    【解决方案1】:

    esent 引擎通过错误代码提示您出了什么问题。在这里查看: https://msdn.microsoft.com/en-us/library/gg269297(v=exchg.10).aspx

    通常,您必须先准备 JET_RETRIEVECOLUMN,然后才能真正尝试通过 JetRetrieveColumn(s) 读取数据,方法是选择要检索的列、准备缓冲区/指针等。当然还有更多内容,但您的问题应该更具体一点。

    【讨论】:

    • 嗨 Fotis Mouratidis,你能给我一个从现有 ESE 数据库中检索数据的例子吗?
    【解决方案2】:

    是的,Fotis 提供了很好的建议。具体的错误代码非常有价值。由于您正在寻找示例代码,因此一些更全面的示例代码是用 C# 编写的。

    查看https://managedesent.codeplex.com/SourceControl/latest 的 EsentInteropTests。搜索 RetrieveColumn,它可以让您很好地了解以哪种顺序调用哪些订单。当然,这不是正确的语言,但您可以轻松翻译。

    我假设您使用 MSysObjects 作为示例,因为每个数据库都有该表。它是供内部使用的,而且很难破译。

    -马丁

    【讨论】:

    • 我现在可以读取整数类型的列,但我仍然无法读取具有字符串值的列。我收到错误 JET_errColumnNotFound。我确信我给出的 columnid 是正确的。请让我知道如何从表中读取字符串值。这是代码
    • JET_COLUMNID columnid = 12; wchar_t buffer[ 2048 ] = { 0 }; err = ::JetRetrieveColumn( sessionID, tableId, columnid, &buffer, sizeof( buffer ), NULL, 0, NULL);
    • 如果您收到该错误消息,您应该信任它并再次查找 columnId。在调用 JetRetrieveColumn 之前,您应该调用 JetGetColumnInfo 来获取正确的 ColumnId。
    • JetRetrieveColumn 将 void* 作为缓冲区,因此编译器不会对类型检查有太大帮助。您应该传入buffer&buffer[0] 作为参数。你可能会用你拥有的代码破坏你的堆栈。
    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多