使用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是个局部变量,无法引用呀。
我觉得微软不会犯这种低等毛病吧,肯定是我还没有理解到位,请各位高人给我个答案。