我刚开始通过c++与数据库进行接口,我想知道做以下工作的最佳方法是什么:
我有一个对象,其中包含提前定义的成员变量,以及需要从数据库中提取的成员变量(给定已知变量)。例如:
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
}现在,我可以做这样的事情:
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,给出每对input1和input2。
这在C#中是非常简单的,但是从我在网上发现的代码示例来看,在C++中它看起来非常难看。我被困在两件事上了。如前所述,我对C++中的数据库接口完全陌生,有很多方法可供选择,但我想研究一种真正适合我的特定方法。此外--这就是目的--我试图使用静态数据集在单个查询中提取数据,而不是为每个input2 1/input2 2组合运行一个新的查询;更好的是,是否有一种方法可以将数据库结果直接写入新创建的DataObject,而不是在某个临时的RecordSet对象中设置一个停止点。
总结和澄清:我在关系数据库上有数据库,我试图将数据提取并存储到对象集合中。我该怎么做?任何建议/方向-我非常感激。
编辑8/16/17:经过一些研究和试验,我提出了下面的
因此,我使用了一个ADORecordset,将put_CursorLocation设置为adUseServer,从而取得了进展
rs->put_CursorLocation(adUseServer)我的理解是,通过使用此设置,查询结果存储在服务器上,客户端只获得rs指向的当前行。
因此,我从行中获取数据并当场创建DataObject,将其转化为向量,最后调用rs->MoveNext()获取下一行,并重复到最后。部分例子如下:
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或其他任何选项。
发布于 2017-08-07 18:19:40
我想到两个选项:按成员类型和BLOB。
对于类,我建议每个类实例一行,每个成员一列。按数据库搜索受支持的数据类型。有一些常见的类型。
另一种方法是使用BLOB (二进制大型OBject)数据类型。这是一种“二进制”数据类型,用于按原样存储数据。
对于不支持数据类型的成员,可以使用BLOB类型。
通过研究“数据库规范化”或“数据库范式”,您可以变得更加复杂。
https://stackoverflow.com/questions/45552879
复制相似问题