我封装的ADO类ADOConn
class ADOConn
{
public:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
public:
ADOConn(){::CoInitialize(NULL);m_pConnection=NULL;m_pRecordset=NULL;}
virtual ~ADOConn(){::CoUninitialize();}
int DefaultConn();//建立连接m_pConnection;
void ExitConnect(){
if (NULL != m_pRecordset)
if (m_pRecordset->State)
m_pRecordset->Close();
if (NULL != m_pConnection)
if (m_pConnection->State)
m_pConnection->Close();
}
};
我在有一个线程需要时时检测数据库数据,我在线程里用的是下面的代码
while(1)
{
Sleep(1000);
ADOConn adoconn;
adoconn.DefaultConn();
........//一些数据删除,修改,查询的操作.
adoconn.ExitConnect();
}
//上面的代码可以运行一段时间,时间不固定,长时10分,短时3分,就报一个0xc0000005 Asscess violation的错误,
class ADOConn
{
public:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
public:
ADOConn(){::CoInitialize(NULL);m_pConnection=NULL;m_pRecordset=NULL;}
virtual ~ADOConn(){::CoUninitialize();}
int DefaultConn();//建立连接m_pConnection;
void ExitConnect(){
if (NULL != m_pRecordset)
if (m_pRecordset->State)
m_pRecordset->Close();
if (NULL != m_pConnection)
if (m_pConnection->State)
m_pConnection->Close();
}
};
我在有一个线程需要时时检测数据库数据,我在线程里用的是下面的代码
while(1)
{
Sleep(1000);
ADOConn adoconn;
adoconn.DefaultConn();
........//一些数据删除,修改,查询的操作.
adoconn.ExitConnect();
}
//上面的代码可以运行一段时间,时间不固定,长时10分,短时3分,就报一个0xc0000005 Asscess violation的错误,
if (NULL != m_pRecordset)
{
m_pRecordset->Close();
pRecordset=NULL;
}
if (NULL != m_pConnection)
{
m_pConnection->Close();
pConnection=NULL;
}
还有一个潜在的问题就是
........//一些数据删除,修改,查询的操作.
如果你这个过程比较长,比如里面有存储过程的调用等耗时操作.可能会在这个操作没完成之前就进入到下一个循环.从而造成数据库连接数过多或数据库死锁等问题.
adoconn.DefaultConn();
while(1)
{
........//一些数据删除,修改,查询的操作.
}
adoconn.ExitConnect();
http://www.codeproject.com/database/mtdaorecordset.asp
........//一些数据删除,修改,查询的操作.
如果你这个过程比较长,比如里面有存储过程的调用等耗时操作.可能会在这个操作没完成之前就进入到下一个循环.从而造成数据库连接数过多或数据库死锁等问题.TO:lzzqqq(Jonersen)
我这里面暂时涉及到的是查询一条记录,判断此记录状态,如果不符合要求,UPDATE一下,
这些操作会有你说的那个潜在的问题么????
你用了吗??还有release也没有看到??这些都是需要的
智能指针需要release吗??/我印象中好象不需要.createinstance已经被封装在类函数里头了.比如:DefaultConn(),(建立连接)
GetRecordSet()(执行select语句,并把得到记录交给m_pRecordset)等函数.
智能指针需要release吗??/我印象中好象不需要.createinstance已经被封装在类函数里头了.比如:DefaultConn(),(建立连接)
GetRecordSet()(执行select语句,并把得到记录交给m_pRecordset
void ExitConnect()
{
if (NULL != m_pRecordset)
{
m_pRecordset->Close();
m_pRecordset->Release();
m_pRecordset=NULL;
}
if (NULL != m_pConnection)
{
m_pConnection->Close();
m_pConnection->Release();
m_pConnection=NULL;
}
}
一个createinstance
对应一个release
ADOConn adoconn;
adoconn.DefaultConn();
while(1)
{
........//一些数据删除,修改,查询的操作.
}
adoconn.ExitConnect();
用这种方法运行了40分,没有出现问题,但感觉治标没治本,
放在循环内部怎么做才能不报错处理,我想只有解决了这个问题,才会让我认识问题的本质.我接着试下楼上的这个方法
void ExitConnect()
{
if (NULL != m_pRecordset)
{
m_pRecordset->Close();
m_pRecordset->Release();
m_pRecordset=NULL;
}
if (NULL != m_pConnection)
{
m_pConnection->Close();
m_pConnection->Release();
m_pConnection=NULL;
}
}
用Release后,第一个循环就抱了错,追到代码里面去,发现是在析构adoconn时,代码内部已经调用了_release(),
所以我觉得这里的问题不是release()的问题,
有可能是lzzqqq(Jonersen)大哥说的数据库连接还没来的及断开就进入下个循环了,
我接着这样试下.while(1)
{
ADOConn adoconn;
adoconn.DefaultConn();
........//一些数据删除,修改,查询的操作.
adoconn.ExitConnect
Sleep(3000);
}