我收到异常" GetFieldValue操作在字段上失败..."使用CRecordset实例调用GetFieldValue()函数时。它适用于单线程,但仅在多线程时导致错误。正在使用以下声明。有什么帮助吗?
打开数据库:
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);
答案 0 :(得分:0)
确定问题并修复它。出现异常是因为两个不同的线程尝试访问相同的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);
访问http://www.boost.org/doc/libs/1_41_0/doc/html/thread/synchronization.html以了解有关锁定的更多信息。