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

时间:2015-02-16 14:57:16

标签: c++ sql-server odbc

我收到异常" 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);

1 个答案:

答案 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以了解有关锁定的更多信息。