我得到一个异常"GetFieldValue操作在字段上失败.“使用GetFieldValue实例调用CRecordset ()函数时。它可以很好地工作在单线程,但只造成错误的多线程.正在使用下列语句。有什么帮助吗?
若要打开数据库:
CDatabase dbhandle;
dbhandle.OpenEx(dsn.c_str(), CDatabase::noOdbcDialog);
若要执行查询和打开记录集,请执行:
boost::shared_ptr<CRecordset> recordset(new CRecordset( &dbhandle ));
recordset->Open(AFX_DB_USE_DEFAULT_TYPE, selectquery.c_str(), CRecordset::readOnly | CRecordset::executeDirect);
阅读结果:
recordset->GetFieldValue(fieldname.c_str(), value, SQL_C_CHAR);
发布于 2015-02-19 12:59:44
找出了问题并解决了。出现此异常是因为两个不同的线程试图访问相同的CDatabase
句柄。CDatabase
现在并不是线程安全的。
解决方案是使用mutex
实现应用程序级锁定。为CDatabase
编写适配器类,并对所有操作执行锁/解锁。
// 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阅读有关锁定的更多信息。
https://stackoverflow.com/questions/28544193
复制相似问题