SQLAllocHandle分配SQL语句句柄时不返回了,程序死到这了

stavck 2005-08-24 10:38:56
我写了一个使用ODBC API 访问access数据库的程序,正常测试都没有什么问题,都通过了.
这时想试一试数据库异常时候的程序的错误处理过程是否正常,就把Access打开,使用独占方式打开一个程序要访问的表,这时在调试程序,发现问题:
当程序想查询此表时,程序会停到SQLAllocHandle,该函数并不返回,没有任务错误提示.
不知道大家碰到过没有?
...全文
322 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
stavck 2005-08-29
  • 打赏
  • 举报
回复
真的这么难么?
skyfine 2005-08-26
  • 打赏
  • 举报
回复
这些东西,太深了不懂。

不过有个小想法,做一个监听线程。
stavck 2005-08-26
  • 打赏
  • 举报
回复
今天还是没有搞定,有高手没?
BuZhang_AP97091 2005-08-25
  • 打赏
  • 举报
回复
用副线程去读取数据库,不要让界面线程没反应和反应迟顿
stavck 2005-08-25
  • 打赏
  • 举报
回复
是的,可能我没有说明白,如果是数据库连接断开的话,辅助线程再操作,可以报错,然后继续的.
问题就是当主线程重新连接了数据库,这时,辅助线程再使用数据库连接句柄进行任何操作,都会死掉.


to:DentistryDoctor
您说的同步是怎么一回事?



注:

辅助线程是通过数据库连接句柄的指针访问的
DentistryDoctor 2005-08-25
  • 打赏
  • 举报
回复
试试在连接,断开及访问数据库时进行一下同步。
stavck 2005-08-25
  • 打赏
  • 举报
回复
老大,odbc连接数据我还是会的,问题是现在主线程控制数据库的连接,辅助线程使用这个数据库连接进行表操作,如果主线程不重连数据库,那么辅助线程都运行得很high啊,但是如果主线程出现异常,需要重连数据库时,辅助线程就不顶了.

辅助线程是不负责连接数据库的.所有也没什么超时设置的问题.

程序将来要用到oracle上,不可能每个线程分配一个数据库连接的,支持50个连接的oracle数据库可是要卖26w的.
stavck 2005-08-25
  • 打赏
  • 举报
回复
不会是access的问题吧?
DentistryDoctor 2005-08-25
  • 打赏
  • 举报
回复
BOOL CODBCManager::Connect()
{
SQLRETURN retcode;

retcode = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&m_henv);
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLSetEnvAttr(m_henv,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3,0);
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLAllocHandle(SQL_HANDLE_DBC,m_henv,&m_hdbc);
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLSetConnectAttr(m_hdbc,(long)SQL_LOGIN_TIMEOUT,(void *)5,0);
if(m_bAutoCommit)
SQLSetConnectAttr(m_hdbc,(long)SQL_ATTR_AUTOCOMMIT,(void *)SQL_AUTOCOMMIT_ON,0);
else
SQLSetConnectAttr(m_hdbc,(long)SQL_ATTR_AUTOCOMMIT,(void *)SQL_AUTOCOMMIT_OFF,0);
retcode = SQLConnect(m_hdbc,(SQLCHAR *)(LPTSTR)m_szDSN,SQL_NTS,
(SQLCHAR *)(LPTSTR)m_szUserName,SQL_NTS,(SQLCHAR *)(LPTSTR)m_szPassword,SQL_NTS);
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT,m_hdbc,&m_hstmt);
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
return TRUE;
else
PromptSQLError(SQL_HANDLE_STMT,m_hstmt,(SQLCHAR*)"SQL_HANDLE_STMT");
SQLDisconnect(m_hdbc);
}
else
PromptSQLError(SQL_HANDLE_DBC,m_hdbc,(SQLCHAR*)"SQL_HANDLE_DBC");

SQLFreeHandle(SQL_HANDLE_DBC,m_hdbc);
}
else
PromptSQLError(SQL_HANDLE_ENV,m_henv,(SQLCHAR*)"SQL_HANDLE_ENV");
}
else
PromptSQLError(SQL_HANDLE_ENV,m_henv,(SQLCHAR*)"SQL_HANDLE_ENV");
SQLFreeHandle(SQL_HANDLE_ENV,m_henv);
}
return FALSE;
}

//SQLSetConnectAttr(m_hdbc,(long)SQL_LOGIN_TIMEOUT,(void *)5,0);一句用于设置连接超时为5秒
DentistryDoctor 2005-08-25
  • 打赏
  • 举报
回复
很久没用Access了。
stavck 2005-08-25
  • 打赏
  • 举报
回复
我程序是这样的,主线程中有一个数据库连接,有3个辅助的线程使用这个连接去操作表,当主线程把数据库的连接重新连接后,辅助线程就会停在分配sql语句句柄那个函数的地方.

如果是某一个线程重新连接数据库的话,那么他再去操作数据库,是可以的.而其他的线程则不行

现在我怀疑是不是对多线程支持的问题啊!

4,011

社区成员

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

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