首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CRecordset::GetFieldValue异常“字段GetFieldValue操作失败.”在c++多线程中

CRecordset::GetFieldValue异常“字段GetFieldValue操作失败.”在c++多线程中
EN

Stack Overflow用户
提问于 2015-02-16 14:57:15
回答 1查看 849关注 0票数 0

我得到一个异常"GetFieldValue操作在字段上失败.“使用GetFieldValue实例调用CRecordset ()函数时。它可以很好地工作在单线程,但只造成错误的多线程.正在使用下列语句。有什么帮助吗?

若要打开数据库:

代码语言:javascript
运行
复制
CDatabase dbhandle;
dbhandle.OpenEx(dsn.c_str(), CDatabase::noOdbcDialog);

若要执行查询和打开记录集,请执行:

代码语言:javascript
运行
复制
boost::shared_ptr<CRecordset> recordset(new CRecordset( &dbhandle ));
recordset->Open(AFX_DB_USE_DEFAULT_TYPE, selectquery.c_str(), CRecordset::readOnly | CRecordset::executeDirect);

阅读结果:

代码语言:javascript
运行
复制
recordset->GetFieldValue(fieldname.c_str(), value, SQL_C_CHAR);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-19 12:59:44

找出了问题并解决了。出现此异常是因为两个不同的线程试图访问相同的CDatabase句柄。CDatabase现在并不是线程安全的。

解决方案是使用mutex实现应用程序级锁定。为CDatabase编写适配器类,并对所有操作执行锁/解锁。

代码语言:javascript
运行
复制
// Define lock variable as instance
boost::mutex database_lock;

// Add the below line in each function which access database
boost::unique_lock<boost::mutex> lock(database_lock);

访问0/doc/html/thread/synchronization.html阅读有关锁定的更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28544193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档