【问题标题】:Required advice on choosing proper data type and algorithm for inserting data into database关于选择适当的数据类型和算法以将数据插入数据库的必要建议
【发布时间】:2013-09-12 07:07:31
【问题描述】:

相关资料及简介:

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

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

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

表中的 ElectricEnergy 存储了历年来的能源消耗,因此该表具有以下架构:

ElectricEnergy

填充表如下所示:

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 控件选择月份。

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

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

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

在上述示例中,数据应存储为 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。

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

谢谢。

【问题讨论】:

  • 矢量应该没问题。我不会将数据存储为字符串,除非你真的不想评估它的数值。浮动可能更合适。
  • 此时只是“从GUI读取”/“写入数据库”类型的任务,所以wstring就足够了。我想我总是可以使用 _wtof() 转换为双精度。感谢您的评论,我发现它很有用。
  • 再想一想,一年的数据应该是一个结构体,因为它总是有相同数量的条目。
  • 我同意你的看法,这是更好的解决方案...谢谢你的评论。问候。

标签: c++ winapi ms-access ado


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2016-08-21
    • 2011-05-16
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多