多线程操作数据库,经常出现 "无法更新;当前被锁定"的错误

zpc38368330 2009-03-22 12:32:23
我做了一个程序有两个线程,一个主线程,共3个线程操作数据库,
3个线程都加了CoInitialize(NULL);
而且都如下初始化了连接指针
_ConnectionPtr m_pConn;
HRESULT hr;
m_pConn.CreateInstance(__uuidof(Connection));
m_pConn->ConnectionString=ACCESS_CONNSTR;
m_pConn->ConnectionTimeout=20;
try
{
hr=m_pConn->Open("","","",-1);
}
catch(_com_error e)
{
..............
}
if(FAILED(hr))
{
..............
}
主线程m_pConn是类里的公有变量,其余线程操作数据库时是通过函数传参A(...,_ConnectionPtr m_pConn)来传递指针.
void A(....,_ConnectionPtr m_pConn)
{
_RecordsetPtr m_pRst(__uuidof(Recordset));
_bstr_t vSQL;
vSQL="select * from HistoryRcd where 学号="+stage+" and ..... and .....";
CPCriticalSection.Lock();
try
{
m_pRst->Open(
(_bstr_t)vSQL,m_pConn.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
CPCriticalSection.Unlock();
CString errormessage;
errormessage.Format("%s%s",e.ErrorMessage(),(LPSTR)(LPCSTR)e.Description());
AfxMessageBoxZ(errormessage);
BoolMsg=false;
return ;
}
}
存储数据库是用如下代码
try
{
ado_balance.Format("%d",SetBalance);
m_pRst->PutCollect("分数",_variant_t(ado_balance));
m_pRst->Update();
}
catch(_com_error e)
{
CPCriticalSection.Unlock();
CString cstemp;
MessageBox(NULL,e.Description(),"",0); //无法更新;更新被锁定,报错就是这里报错
return false;
}
最后释放指针
CPCriticalSection.Unlock();
m_pRst->Close();
m_pRst.Release();
现在基本可以说是无规律的出现 "无法更新;更新被锁定"的提示,请问都会有什么情况会出现这种现象?
我感觉不象是临界区的问题,我检查了遍,没发现3个临界区没有锁定的问题,当然也不排除我大脑漏电的可能.
难道是因为我没有做数据库的读写共享?现在我的VC书被别人借去了,去网上搜又搜不到共享该怎么做,能帮忙给个读写共享的代码吗?

查了两天了,真的头都大了,帮忙想想可能出现的情况吧,谢谢
...全文
297 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpc38368330 2009-03-22
  • 打赏
  • 举报
回复
继续等待
oyljerry 2009-03-22
  • 打赏
  • 举报
回复
^_^,jf
zpc38368330 2009-03-22
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090322/09/90fb0898-b2d3-4ff1-9baf-b530871d06e2.html?seed=496423194
zpc38368330 2009-03-22
  • 打赏
  • 举报
回复
此贴已结贴

4,011

社区成员

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

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