相关信息和简介:
我使用 WIN32 用 C++ 制作了一个对话框,用于收集数据,然后使用 ADO 将数据发送到 MS Access 数据库。
数据库有 2 张表,一张是主表,第二张是与其一对多的关系。
为了清楚起见,我将它们命名为:主表是 Building,子表是 ElectricEnergy。
表 ElectricEnergy 存储了月份和年份的能源消耗,因此该表具有以下架构:
ElectricEnergy< #ElectricEnergy_pk、$Building_pk、一月、二月、...、十二月、年份>
填充的表格如下所示:
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 年至今所有年份的大楼每月的电能消耗量。
在对话框中,用户可以输入一年中的每月消耗量,该消耗量是通过向上向下箭头从另一个编辑控件中选择的。
说明这一点的图片如下:
红色矩形显示月份。使用 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 ,但我觉得这种方法不好,而且容易出现缓冲区溢出。
问题:
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/