Я пытаюсь открыть отключенный набор записей в C ++ с помощью ADO & SQL сервер. Код ниже. Если я запускаю код и ничего не закрываю, но оставляю все соединения открытыми, работает правильно. Если я пытаюсь отключить набор записей (используя PutRefActiveConnection) и закрыть объект connect в соответствии с примером MS, я получаю ошибку, что операция не разрешена для открытого соединения. Я пытался клонировать набор записей, но это тоже подбрасывает. Также попытался выполнить PutRefActiveConnection, а затем закрыть. Также пробовал диманские курсоры. Пробовал только для чтения блокировки, оптимистичные и пессимистичные блокировки.
У кого-нибудь есть предложения?
Строка подключения:
Поставщик = SQLNCLI11; Источник данных = GCSQL \ GFDB; DataTypeCompatibility = 80; Начальный каталог = GF_Trades; Trusted_Connection = yes;
Код:
try
{
ADODB::_ConnectionPtr _conn;
hr = _conn.CreateInstance(__uuidof(ADODB::Connection));
_conn->CommandTimeout = 0;
_conn->ConnectionString = _mConnectionString.c_str();
_conn->Open(_conn->GetConnectionString(), "", "", ADODB::adConnectUnspecified);
hr = _mRecordSet.CreateInstance(__uuidof(ADODB::Recordset));
hr = _mRecordSet->Open(_mQueryString.c_str(), _variant_t(_conn, true), ADODB::CursorTypeEnum::adOpenStatic, ADODB::LockTypeEnum::adLockReadOnly, ADODB::adCmdText || ADODB::CursorLocationEnum::adUseClient);
if (hr != S_OK)
{
_mRecordSet = NULL;
_conn->Close();
return;
}
_mRecordSet->PutRefActiveConnection(NULL);
_conn->Close();
}
catch (_com_error e)
{
std::string s = e.Description();
s.append("\n Connection std::string = ");
s.append(_mConnectionString);
std::cout << s << endl;
return;
}
Оказывается, проблема заключалась в построении соединения и открытии набора записей. Установка курсора на стороне клиента должна происходить на уровне соединения, а не в качестве опции для открытия набора записей.
ADODB::_ConnectionPtr _conn;
hr = _conn.CreateInstance(__uuidof(ADODB::Connection));
_conn->CommandTimeout = 0;
_conn->ConnectionString = _mConnectionString.c_str();
_conn->CursorLocation = ADODB::adUseClient;
_conn->Open(_conn->GetConnectionString(), "", "", ADODB::adConnectUnspecified);
hr = _mRecordSet.CreateInstance(__uuidof(ADODB::Recordset));
hr = _mRecordSet->Open(_mQueryString.c_str(), _variant_t(_conn, true),
ADODB::CursorTypeEnum::adOpenStatic, ADODB::LockTypeEnum::adLockReadOnly, ADODB::adCmdText);
_mRecordSet->PutRefActiveConnection(NULL);
_conn->Close();
_conn = NULL;
}
catch (_com_error e)...
Других решений пока нет …