c++ - 关于选择正确的数据类型和算法将数据插入数据库所需的建议

标签 c++ winapi ms-access ado

相关信息和简介:

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

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

说明这一点的图片如下:

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 ,但我觉得这种方法不好,而且容易出现缓冲区溢出。

问题:

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/

相关文章:

winapi - 无法在没有密码的帐户下运行服务?

windows - 你能有一个只包含托盘(通知)图标的 win32 程序吗?

ms-access - 如何在 Access 中 "chain"链接表?

c++ - DCOM 服务器调试

c++ - 如何浅拷贝指向 vector 的指针?

c++ - 如何确定 2 个路径是否在可移植 C++ 中引用同一个文件

.net - 在 ASP.Net 中设计网站 - 用户登录设计和注意事项

c++ - 类包装器和调度器

c++ - 如何隐藏/取消隐藏文件而不删除 Windows 上 C++ 中的其他属性

ms-access - 在Access VBA中获取Combobox.Value