ado — отключенный набор записей в переполнении стека

Я пытаюсь открыть отключенный набор записей в 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;
}

0

Решение

Оказывается, проблема заключалась в построении соединения и открытии набора записей. Установка курсора на стороне клиента должна происходить на уровне соединения, а не в качестве опции для открытия набора записей.

            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)...
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]