首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询数据库以在C++中创建自定义类集合的最佳方法

查询数据库以在C++中创建自定义类集合的最佳方法
EN

Stack Overflow用户
提问于 2017-08-07 17:52:01
回答 1查看 580关注 0票数 0

我刚开始通过c++与数据库进行接口,我想知道做以下工作的最佳方法是什么:

我有一个对象,其中包含提前定义的成员变量,以及需要从数据库中提取的成员变量(给定已知变量)。例如:

代码语言:javascript
复制
class DataObject
{
public:
    int input1;
    string input2;
    double output1;

    DataObject(int Input1, string Input2) :
        input1(Input1), input2(Input2)
    {
        output1 = Initializer(input1,input2);
    }

private:
    Initializer(int, string);
    static RecordSet rs; //I am just guessing the object would be called RecordSet
}

现在,我可以做这样的事情:

代码语言:javascript
复制
std::vector<DataObject> v;
for (int n = 0; n <= 10; ++n)
    for (char w = 'a'; w <= 'z'; ++w)
        v.push_back(DataObject{n,z});

得到一个DataObjects的初始化向量。在幕后,初始化程序将检查rs是否已经有数据。如果没有,它将连接到数据库并查询类似于:select input1, input2, output1 from ... where input1 between 1 and 10 and input 2 between 'a' and 'z'的内容,然后开始使用output1初始化每个DataObject,给出每对input1input2

这在C#中是非常简单的,但是从我在网上发现的代码示例来看,在C++中它看起来非常难看。我被困在两件事上了。如前所述,我对C++中的数据库接口完全陌生,有很多方法可供选择,但我想研究一种真正适合我的特定方法。此外--这就是目的--我试图使用静态数据集在单个查询中提取数据,而不是为每个input2 1/input2 2组合运行一个新的查询;更好的是,是否有一种方法可以将数据库结果直接写入新创建的DataObject,而不是在某个临时的RecordSet对象中设置一个停止点。

总结和澄清:我在关系数据库上有数据库,我试图将数据提取并存储到对象集合中。我该怎么做?任何建议/方向-我非常感激。

编辑8/16/17:经过一些研究和试验,我提出了下面的

因此,我使用了一个ADORecordset,将put_CursorLocation设置为adUseServer,从而取得了进展

代码语言:javascript
复制
rs->put_CursorLocation(adUseServer)

我的理解是,通过使用此设置,查询结果存储在服务器上,客户端只获得rs指向的当前行。

因此,我从行中获取数据并当场创建DataObject,将其转化为向量,最后调用rs->MoveNext()获取下一行,并重复到最后。部分例子如下:

代码语言:javascript
复制
std::vector<DataObject> v;
DataObject::rs.Open(connString,Sql); // Connection for wrapper class

for (int n = 0; n <= 10; ++n)
    for (char w = 'a'; w <= 'z'; ++w)
        v.emplace_back(DataObject{n,z});

// Somewhere else...
void DataObject::Initializer(int a, string b) {
    int ra; string rb; double rc;
    // For simplicity's sake, let's assume the result set is ordered
    //  in the same way as the for-loop, and that no data is missing.
    //  So the below sanity-check would be unnecessary, but included.
    while (!rs.IsEOF())
    {
        // Let's assume I defined these 'Get' functions
        ra = rs.Get<int>("Input1");
        rb = rs.Get<string>("Input2");
        rc = rs.Get<double>("Output1");
        rs.MoveNext();
        if (ra == a && rb == b) break;
    }
    return rc;
}

// Constructor for RecordSet:
RecordSet::RecordSet()
{
    HRESULT hr = rs_.CoCreateInstance(CLSID_CADORecordset);
    ATLENSURE_SUCCEEDED(hr);
    rs_->put_CursorLocation(adUseServer);
}

现在,我希望我正确地解释了这是如何工作的;否则,这将是一个非常麻烦的事情。我不是ADO或.Net专家--很明显--但我希望有人能参与进来,确认这确实是这样的工作方式,也许还能为这个话题提供更多的线索。最后,我使用be 2015的诊断工具测试了内存使用情况,使用adUseClient时堆似乎要大得多。如果我的猜想是正确的,那么为什么会有人选择在adUseServer上使用adUseServer或其他任何选项。

EN

回答 1

Stack Overflow用户

发布于 2017-08-07 18:19:40

我想到两个选项:按成员类型和BLOB。

对于类,我建议每个类实例一行,每个成员一列。按数据库搜索受支持的数据类型。有一些常见的类型。

另一种方法是使用BLOB (二进制大型OBject)数据类型。这是一种“二进制”数据类型,用于按原样存储数据。

对于不支持数据类型的成员,可以使用BLOB类型。

通过研究“数据库规范化”或“数据库范式”,您可以变得更加复杂。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45552879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档