gpt4 book ai didi

c++ - 关于选择适当的数据类型和算法以将数据插入数据库的必要建议

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:48:49 25 4
gpt4 key购买 nike

相关信息及介绍:

我使用 WIN32 在 C++ 中制作了一个对话框,它收集数据,然后使用 ADO 将这些数据发送到 MS Access 数据库。

数据库有两个表,一个是主表,第二个是一对多的关系。

为了清楚起见,我给它们命名:主表是 Building,子表是 ElectricEnergy。

表中的 ElectricEnergy 是按月和年存储的能量消耗,因此该表具有以下架构:

ElectricEnergy< #ElectricEnergy_pk, $Building_pk, January,February, ...,December, Year>

填充后的表格如下所示:

YEAR | January | February | ... | December | Building_pk | ElectricEnergy_pk |
2012 | 20.5 | 250.32 | ... | 300.45 | 1 | 1 |
2013 | 10.5 | 50.32 | ... | 300 | 1 | 2 |

如您所见,表格存储了从 2012 年至今所有年份的建筑物每月的电能消耗。

在对话框中,用户可以通过上下箭头输入从另一个编辑控件中选择的一年的每月消耗量。

说明这一点的图片如下:

enter image description here

红色矩形表示月份。使用 updown 控件选择月份。

蓝色矩形表示年份。年份也可以通过 updown 控件进行选择。

紫色箭头表示输入每月消耗量的编辑控件。

点击左边的+按钮后,数据应该存储在某个变量中。

在上面的示例中,数据应存储为 2013 年 1 月。

问题:

我不知道选择哪种数据类型/算法来正确实现上述行为。

我知道如何使用 ADO 插入数据,但这种情况对我来说很难。

我不知道如何实现每年的数据存储,然后将它们全部转储到数据库中。

到目前为止我做了什么:

由于消费可以存储多少年是未知的,所以我决定使用vector来存储它们。

存储单年数据的 vector 是一个13(12个月+一年)的数组,命名为DataForSingleYear,

还有一个存储所有年份数据的 vector ,名为 ConsumtionForAllYears。

一个小的澄清:

vector< wstring > DataForSingleYear;
vector< vector< wstring > > ConsumtionForAllYears;

我可以成功地将数据推送到 vector DataForSingleYear 中,并且我可以成功地将所有这些年份推送到 vector ConsumtionForAllYears 中。

我是这样做的:

  // this handler is simplified to preserve space

case IDC_BUTTON_PLUS_ON_THE_PICTURE:

DataForSingleYear[ // month chosen from red edit control ] =
( //data from purple edit control );

DataForSingleYear[ 12 // last element stores chosen year ] =
( //data from blue edit control );

ConsumtionForAllYears[ // ( chosen year from blue edit control ) - 2012 ] =
DataForSingleYear;

在 WM_INITDIALOG 对话框中,我像这样初始化 vector :

 DataForSingleYear.assign( 13, L”-1” ); // -1 is default value

for( int i = 0; i < nYears; i++ )
ConsumtionForAllYears.push_back( DataForSingleYear );

在对话框中,有将所有数据加载到数据库中的保存按钮,但在上图中为了节省空间而省略了。

当按下那个按钮,数据成功插入数据库时​​,上面的 vector 应该为新条目重置。

我像这样重置了 vector :

 DataForSingleYear.clear();

DataForSingleYear.assign( 13, L”-1” );

ConsumtionForAllYears.clear();

for( int i = 0; i < nYears; i++ )
ConsumtionForAllYears.push_back( DataForSingleYear );

我是初学者,还没有想出更好的方法来做vector的reset,但是感觉这个方法不好,容易出现buffer overflow。

问题:

1.看到上面描述的数据输入机制,你能确认为它的实现选择的 vector 是好的吗?

2.如果 vector 数据类型是一个不错的选择,你能评论一下我对 vector 的重置吗,因为我认为这不是最好的方法?

2.1.如果不好,能否请您提出改进建议?

3.最后,如果有更合适的数据类型,或者上述数据录入机制的实现,能否请您提出建议?

最后的说明:

我在 Windows XP 上工作,使用 MS Visual Studio 2008。

如果需要任何其他代码、信息或任何其他内容,请提出要求,我会尽快提供。

谢谢。

最佳答案

在我看来,对单个年份数据使用 vector 是错误的。当您拥有所有相似类型的可变长度数据时,应使用 vector 。在您的情况下,这些都不是真的,您总是有 13 个数据元素,并且第一个(年份)与其余(月度值)的类型不同。

我会为您似乎需要的默认初始化声明一个带有构造函数的简单结构

struct YearlyData
{
YearlyData() { year = -1; for (int i = 0; i < 12; ++i) months[i] = -1; }
int year;
double months[12];
}

那么你的初始化代码就简单了

ConsumtionForAllYears.assign(nYears, YearlyData());

和你的重置码完全一样

ConsumtionForAllYears.assign(nYears, YearlyData());

并且不需要 DataForSingleYear

关于c++ - 关于选择适当的数据类型和算法以将数据插入数据库的必要建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18757627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com