多线程操作数据库,为什么出很多莫名其妙的问题,有代码
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 函数出错 展开
{
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 函数出错 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询