C++ CRecordset::GetFieldValue异常;GetFieldValue操作在字段上失败…“;在c++;多线程

C++ CRecordset::GetFieldValue异常;GetFieldValue操作在字段上失败…“;在c++;多线程,c++,sql-server,odbc,C++,Sql Server,Odbc,使用CRecordset实例调用GetFieldValue()函数时,我遇到异常“GetFieldValue对字段的操作失败…”。它适用于单线程,但只适用于多线程。正在使用以下语句。有什么帮助吗 要打开数据库,请执行以下操作: CDatabase dbhandle; dbhandle.OpenEx(dsn.c_str(), CDatabase::noOdbcDialog); 要执行查询并打开记录集,请执行以下操作: boost::shared_ptr<CRecordset> rec

使用CRecordset实例调用GetFieldValue()函数时,我遇到异常“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);

确定了问题并修复了它。出现异常是因为两个不同的线程试图访问相同的
CDatabase
句柄<代码>CDATA基础目前不是线程安全的

解决方案是使用
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);
//将锁变量定义为实例
互斥数据库锁;
//在访问数据库的每个函数中添加以下行
boost::唯一的锁(数据库锁);

访问以了解有关锁定的更多信息。

我想您是在不同的线程中进行读取(GetFieldValue)和创建(…new CRecordset)的吗?不支持多个线程访问同一CRecordset。请参阅:quote:“创建多线程应用程序时,使用多个线程操作同一对象时应非常小心。例如,在两个线程中使用同一CRecordset对象可能会导致检索数据时出现问题;”它使用同一线程创建和读取记录集。其他线程也在同一个表中执行相同的操作,但记录不同。
// 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);