(50分求解)为了通用性 ,使用vector 造成的问题

caddor2011 2011-11-21 02:22:45
写了一个数据库操作类(vc+ado方式)

放在dll中,,, 整个dll不依赖与任何具体的数据库、任何具体的表。。。


数据库提供主要的接口,查询、删除(插入、增加)两类操作!!!

我查询后,把结果存在这个操作类的一个vector<vector<_variant_t> >result 似有成员中中!!!!

exe 调用查询函数后,则去遍历result!!!


以前觉得这个法子,挺好的。。。。通用性挺好。。。

今天发现,糟糕透了了,,,,,,,,,,,原因如下:

查询一张表,再次查询第二章表。。。。。 vector的独特性!!! 会导致 vector继续增加内容!!!

第二个问题:表与表不同,会造成vector的二维宽度出现问题,比如:一张是四个字段,另一表,是五个字段!!

如果想不才出问题,那么程序中每连接一次数据库,则 建立一个操作类对象,浪费内存,而且 多次连接,效率很低。。。

如何改进???

一。保证 通用性,二,继续使用vector,
能再这个前提下 该井吗?




...全文
108 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
caddor2011 2011-11-21
  • 打赏
  • 举报
回复

不好意思啊,怪我没有说清楚问题

我没有用mfc的Connection,是用智能指针:

private:
_ConnectionPtr m_pConn; //连接指针
_RecordsetPtr m_pRes; //结果集指针
BOOL bIsConn; //是否连接成功
vector<_variant_t> column_name; //保存列名
vector<vector<_variant_t>> result; // vector<vector <_variant> > result;查询后将结果保存在这里,一个元素为一条完整的记录,记录又是一个CString向量,调用者需要提供一个函数,将向量解析





[Quote=引用 7 楼 lofeo 的回复:]
以下伪码实现是放在你的“数据库操作类”中。这样不用修改很多地方啊。

C/C++ code
static Connection _conn;
static Connection* GetConnection()
{
if(Connection.isClosed())
{
_conn.connect();
}
return &_conn;
}
[/Quote]
闲的每日C 2011-11-21
  • 打赏
  • 举报
回复
以下伪码实现是放在你的“数据库操作类”中。这样不用修改很多地方啊。
static Connection _conn;
static Connection* GetConnection()
{
if(Connection.isClosed())
{
_conn.connect();
}
return &_conn;
}

caddor2011 2011-11-21
  • 打赏
  • 举报
回复

已经做了,不能修改,, 毕竟很累的,



[Quote=引用 3 楼 lofeo 的回复:]
vector<vector<_variant_t> >result,这样的确有缺点。还是使用Recordset,不要对数据做那样的包装的好。在对于具体数据库的表做对应的struct或class包装会好多。
[/Quote]
caddor2011 2011-11-21
  • 打赏
  • 举报
回复
当时只想着通用性

没有想过多了


vector<vector<_variant_t> > v

这种类型,我的清空是v.size();
调用查询函数前 ,清空一次即可。。。

问题是:二维的清空!!

这么说, 加入 五个字段,。二维则变成了5!!

有十条记录,一维则是10,一维可以清空‘

二维如何清空????

4楼 的用法,我先不考虑,原因是, 不想该过多地方,毕竟该很多地方,很麻烦。。。。

非常谢谢 各位。。



[Quote=引用 1 楼 qscool1987 的回复:]
vector<vector<_variant_t> >result
你把查的信息插入里面去了是吧,
然后你查其他表的信息又插入进去了是吧
然后怎么了?你就不知道如何遍历信息了??
没道理,你清空不行吗?遍历不同的表之前清空一次
[/Quote]
闲的每日C 2011-11-21
  • 打赏
  • 举报
回复
那么程序中每连接一次数据库,则 建立一个操作类对象,浪费内存,而且 多次连接,效率很低。
对于这个优化,可以使用“单件模式”。就是所以对象对应的连接对象只有一个static的ado连接,使用条件判断这个连接对象的状态,如果已经关闭才再次连接。
static Connection _conn;
static Connection* GetConnection()
{
if(Connection.isClosed())
{
_conn.connect();
}
return &_conn;
}
闲的每日C 2011-11-21
  • 打赏
  • 举报
回复
vector<vector<_variant_t> >result,这样的确有缺点。还是使用Recordset,不要对数据做那样的包装的好。在对于具体数据库的表做对应的struct或class包装会好多。
zhao1zhong6 2011-11-21
  • 打赏
  • 举报
回复
插入的位置不对,一个洞只能插一个。
如果不能清空就见一个结构
struct variant

vector<_variant_t> v1;
vector<_variant_t> v2;

vector< variant > vva;
qscool1987 2011-11-21
  • 打赏
  • 举报
回复
vector<vector<_variant_t> >result
你把查的信息插入里面去了是吧,
然后你查其他表的信息又插入进去了是吧
然后怎么了?你就不知道如何遍历信息了??
没道理,你清空不行吗?遍历不同的表之前清空一次

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧