使用OLEDB操作数据库的一个疑问:使用Open打开数据库,不需要关闭吗?

zzgff 2007-06-06 04:04:59
class CdbotblProjectAccessor
{
public:
LONG m_fldProjectid;
TCHAR m_fldProject[11];

BEGIN_COLUMN_MAP(CdbotblProjectAccessor)
COLUMN_ENTRY(1, m_fldProjectid)
COLUMN_ENTRY(2, m_fldProject)
END_COLUMN_MAP()

DEFINE_COMMAND(CdbotblProjectAccessor, _T(" \
SELECT \
fldProjectid, \
fldProject \
FROM dbo.tblProject"))

// You may wish to call this function if you are inserting a record and wish to
// initialize all the fields, if you are not going to explicitly set all of them.
void ClearRecord()
{
memset(this, 0, sizeof(*this));
}
};

class CdbotblProject : public CCommand<CAccessor<CdbotblProjectAccessor> >
{
public:
HRESULT Open()
{
HRESULT hr;

hr = OpenDataSource();
if (FAILED(hr))
return hr;

return OpenRowset();
}
HRESULT OpenDataSource()
{
HRESULT hr;
CDataSource db;
CDBPropSet dbinit(DBPROPSET_DBINIT);

dbinit.AddProperty(DBPROP_AUTH_PASSWORD, OLESTR("fff"));
........
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
hr = db.Open(_T("SQLOLEDB.1"), &dbinit);
if (FAILED(hr))
return hr;

return m_session.Open(db);
}
HRESULT OpenRowset()
{
return CCommand<CAccessor<CdbotblProjectAccessor> >::Open(m_session);
}
CSession m_session;
};

上面的代码是我直接从VC自动生成的代码中拷贝下来的。请注意:
1.在OpenDataSource()中使用了db.Open打开了数据库;
2.在OpenDataSource()中最后返回了m_session.Open的结果。

但是没有发现在何处要调用db.Close和m_session.Close,也就是说数据库对象与会话对象只进行了打开,而没有进行关闭。疑问:
1.这样只打开而不关闭,难道数据库对象与会话对象能自动关闭吗?如果不能自动关闭,难道不会占用资源吗?
2.如果需要关闭这两个对象的话,为什么没有自动生成?是需要自己添加这个功能吗?
3.如果要自己添加关闭功能,对与m_session还可以通过类变量引用,但是对与db怎么办呢,db是个局部变量,无法引用呀。
我觉得微软不会犯这种低等毛病吧,肯定是我还没有理解到位,请各位高人给我个答案。
...全文
260 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanhqk 2007-10-17
  • 打赏
  • 举报
回复
1。数据库连接打开后,可以一直使用,知道出错或者程序退出时,需要关闭。
2。数据集也是一样的道理,可以重复使用,只是每次都需要更改条件,重新提交。
3。关闭的位置可以在数据库连接类的析构函数中或者在对象的析构函数中。
shakaqrj 2007-10-17
  • 打赏
  • 举报
回复
没用过这个
一定要关闭的
会不会在某处没发现,还是发生在析构的时候?
ocean_shark 2007-10-17
  • 打赏
  • 举报
回复
一定要关闭的,最好自己写一个函数 关闭
void CloseDataSource()
{
m_session.Close();
}
CathySun118 2007-06-06
  • 打赏
  • 举报
回复
一定要关闭,要不会有内存溢出
koffighter 2007-06-06
  • 打赏
  • 举报
回复
没用过OleDb,但数据库打开时一定要关闭的。关闭函数应该是在基类的某个方法调用了。

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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