找了好久,终于找到问题所在,只是不知道怎么解决,请耐心看,我已经简化了,谢谢视图类中:注:下面这个事件可以成功,100%正确,连接成功void CMyView::OnTestTest() //一菜单命令,可以执行
{
_ConnectionPtr m_pConnection;
HRESULT hr;
hr=m_pConnection.CreateInstance("ADODB.Connection"); if(SUCCEEDED(hr))
{
hr=m_pConnection->Open((_bstr_t)strConnection,"","",-1); //strConnection是我的连接串,100%正确,会弹出连接成功的消息框呵
AfxMessageBox("连接成功");
} else
{
AfxMessageBox("连接失败");
}
}
注: 下面这个就不会连接成功
一个全局线程函数,视图类一事件驱动它: UINT StartUpdateBookThreadProc(LPVOID pParam)
{
CMyView *pView=(CMyView*)pParam; //为视图类的指针
pView->OnTestTest(); //注:会弹出连接不成功
return 0;}请大虾帮忙
解决方案 »
- 绘制半径很小的圆时出现毛刺怎么办?
- 关于IE控件的问题?
- [求助]关于MFC的单文档应用程序的客户区无法接收键盘输入问题
- DDK编译问题
- 问一个关于多客户机连接的网络编程~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 各位请教一个关于菜单的问题
- CString str="Tue, 21 May 2002 07:57:57 GMT";如何把它赋值给COleDateTime和SYSTEMTIME tm,帮我up有分~~~
- C++ BUILDER 如何调用 VC 写的与CLASS有关的DLL
- 怎样做一个局域网用的QQ?(100分)
- 用VC,ADO现在问ACCESS还是SQL SERVER 好
- 谁能告诉我如何取得CDataGrid中当前选择的行在数据集里的位置
- 请问高手,如何让数据库(SQL Server)自动删除一些过期的记录,避免表无限增大。
还有就是你catch一下,看看具体是什么错误.最好调用一次GetLastError();才好找到具体的原因
CoInitializeEx(NULL, COINIT_MULTITHREADED);
#else
CoInitialize(NULL);
#endif m_pConnection.CreateInstance(__uuidof(Connection)); try
{
m_pConnection->ConnectionTimeout = 8; CString strModulePath;
GetModuleFileName(NULL, strModulePath.GetBufferSetLength(_MAX_PATH), _MAX_PATH);
strModulePath.ReleaseBuffer(); int nFindPos = strModulePath.ReverseFind('\\');
if(nFindPos != -1)
{
strModulePath = strModulePath.Left(nFindPos);
} CString strConnect;
strConnect.LoadString(IDS_CON_STR_MDB);
strConnect += strModulePath + "\\MediconBackup\\Data\\Studio.mdb";
m_pConnection->Open(LPCTSTR(strConnect),"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败!");
m_pConnection = NULL; return FALSE;
}--------------------------------------------------------------------------//调用 HRESULT hResult = NULL;
_RecordsetPtr pRecordset = NULL;
pRecordset.CreateInstance("ADODB.Recordset");
hResult = pRecordset->Open("SELECT * FROM [TableName]",_variant_t((IDispatch *) m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);
它的参数dwCoInit
可以取如下的值:
COINIT_MULTITHREADED
Initializes the thread for multi-threaded object concurrency (see Res).
COINIT_APARTMENTTHREADED
Initializes the thread for apartment-threaded object concurrency (see Res).
COINIT_DISABLE_OLE1DDE
Disables DDE for Ole1 support.
COINIT_SPEED_OVER_MEMORY
Trades memory for speed.
其中,如果选择COINIT_APARTMENTTHREADED 那就不需要你自己写并行控制机制,因为它是把对数据库的访问串行化了,如果选择COINIT_MULTITHREADED 则可以实现访问的并行性,但要在各个线程见同步,以防冲突。详见MSDN。
行不行呢?