2

相关资料及介绍:

我使用 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 年至今的所有年份的每月电能消耗量。

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

说明这一点的图片如下:

在此处输入图像描述

红色矩形显示月份。月份是通过上下控制选择的。

蓝色矩形显示年份。年份也是通过上下控制选择的。

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

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

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

问题:

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

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

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

到目前为止我做了什么:

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

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

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

一个小小的说明:

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

我可以成功地将数据推送到向量 DataForSingleYear 中,并且我可以成功地将所有这些年推送到向量 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 对话框中,我对向量进行了初始化,如下所示:

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

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

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

当按下该按钮并且数据成功插入数据库时​​,上述向量应重置为新条目。

我确实重置了这样的向量:

 DataForSingleYear.clear();

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

 ConsumtionForAllYears.clear();

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

我是初学者,还没有想出更好的方法来做vector的reset,但是我觉得这种方法不好,容易出现缓冲区溢出。

问题:

1. 看到上面描述的数据输入机制,你能确定其实现的向量选择是好的吗?

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

2.1.如果不好,你能建议改进吗?

3.最后,如果有更合适的数据类型,或者上述数据录入机制的实现,您能推荐一下吗?

最后注意事项:

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

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

谢谢你。

4

1 回答 1

2

在我看来,对单年数据使用向量是错误的。当您拥有所有相似类型的可变长度数据时,应使用向量。在您的情况下,这些都不是真的,您总是有 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

于 2013-09-12T07:46:26.147 回答