多线程操作数据库,为什么出很多莫名其妙的问题,有代码

UINTSock_thread(LPVOIDl){HRESULThr;//m_clist.DeleteAllItems();//CoUninitialize();_Con... UINT Sock_thread(LPVOID l)
{

HRESULT hr;

// m_clist.DeleteAllItems();
// CoUninitialize();
_ConnectionPtr pConn;//(__uuidof(Connection));
pConn.CreateInstance(__uuidof(Connection));
_RecordsetPtr pRst;
pRst.CreateInstance(__uuidof(Recordset));
// _ConnectionPtr pConn(__uuidof(Connection));
// _RecordsetPtr pRst(__uuidof(Recordset));
pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\db1.mdb;Persist Security Info=False";
pConn->ConnectionTimeout=15;
hr=pConn->Open("","","",-1);
while (1)
{
pRst=pConn->Execute("select * from upinfo",NULL,adCmdText);
// MessageBox((_bstr_t)pRst->GetCollect("姓氏"));
int i=0;
CString cst;
while(!pRst->adoEOF)
{
cst=(LPCSTR)((_bstr_t)pRst->GetCollect("姓氏"));
// m_clist.InsertItem(i,cst);
cst=(LPCSTR)((_bstr_t)pRst->GetCollect("cppass"));
// m_clist.SetItemText(i,1,cst);
pRst->MoveNext();
i++;
//AfxMessageBox(cst);
Sleep(1);
}
}
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();

return 1;
}

UINT Sock_thread2(LPVOID l)
{

HRESULT hr;

// m_clist.DeleteAllItems();

_ConnectionPtr pConn;//(__uuidof(Connection));
pConn.CreateInstance(__uuidof(Connection));
_RecordsetPtr pRst;
pRst.CreateInstance(__uuidof(Recordset));

pConn->ConnectionString="FILE NAME=mdb.udl";
hr=pConn->Open("","","",adConnectUnspecified);
pRst->Open("select * from upinfo",pConn.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
// pRst=pConn->Execute("select * from upinfo",NULL,adCmdText);
// MessageBox((_bstr_t)pRst->GetCollect("姓氏"));

int i=0;
CString cst;
/*while(!pRst->adoEOF)
{
cst=(LPCSTR)((_bstr_t)pRst->GetCollect("姓氏"));
// m_clist.InsertItem(i,cst);
cst=(LPCSTR)((_bstr_t)pRst->GetCollect("cppass"));
// m_clist.SetItemText(i,1,cst);
pRst->MoveNext();
i++;
}
*/
pRst->AddNew();
pRst->PutCollect("姓氏",_variant_t("111"));
pRst->PutCollect("cppass",_variant_t("222"));
pRst->Update();
pConn->Close();
pRst->Close();
pConn.Release();
pRst.Release();

return 1;
}

启动DEBUG程序后,总是有非法操作,单步跟踪的时间先执行的第一个线程,有时不一定跟到那步就出现kernel32.dll错误的提示信息,才开始我是这样_ConnectionPtr pConn(__uuidof(Connection));实例化的,经常会在这出现Unhandled exception in test.exe(KERNEL32.DLL):0xE06D7363:Microsoft C++ Exception 的错误信息,后来我用
_ConnectionPtr pConn;//(__uuidof(Connection));
pConn.CreateInstance(__uuidof(Connection));这种方式去实例化,这力就没问题了,但程序运行到 pConn->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\db1.mdb;Persist Security Info=False";又出现KERNEL32.DLL问题,而我把 UINT Sock_thread2(LPVOID l)线程中间的代码都给注释起来,线程1就 能正常运行,我真的糊涂了.哪位高手帮帮忙,最好能详细的回答一下,毕竟我还是个菜鸟,或者给个网址有ADO详细易懂的教程,过后我自己参考一下
,问题补充里所注释的代码就是在第二个线程(增加纪录的线程),将所有的代码全部注释起来,只留一个return 0;,居然第一个读取纪录的线程能运行下去,而且我用AfxMessageBox能正常显示所读取的数据....我在基于对话框的程序里的XXXAPP.CPP里的InitInstanc()里加了CoInitialize(NULL);在ExitInstance()里加了卸载COM库函数,是不是单线程可以不在线程里单独声明?
而且还有个问题,我按F10执行单步调试,因没有线程同步,肯定要出问题(这也是刚查到的),可是出问题的地方没有规律,比如说写的线程,执行玩UPDATE后,应该写完纪录了,如下
while(1)
{
Sleep(3);
pRst->AddNew();
pRst->PutCollect("姓氏",_variant_t("111"));
pRst->PutCollect("cppass",_variant_t("222"));
pRst->Update();
}
然后线程执行一边后再次循环到SLEEP(3)停住,转到线程1
while(!pRst->adoEOF)
{
cst=(LPCSTR)((_bstr_t)pRst->GetCollect("姓氏"));
cst=(LPCSTR)((_bstr_t)pRst->GetCollect("cppass"));
pRst->MoveNext();
i++;
Sleep(1);
}
线程1前几行代码都没出问题,然后到了Sleep(1),按下F10后,就弹出K....32.dll错误,程序居然会在Sleep 函数出错
展开
 我来答
wawoo2007
2008-03-20 · TA获得超过626个赞
知道小有建树答主
回答量:465
采纳率:0%
帮助的人:638万
展开全部
每个线程在使用COM组件之前都必须声明它的 套间类型 ,即在每个线程使用组件对象之前都要调用CoInitialize,并在退出之前调用CoUninitialize。LZ的程序没有调用,对象根本就没有创建出来,继续运行就会访问0指针,当然会非法操作了。我不明白LZ说注释掉部分代码可以正常运行是怎么回事。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式