Я пытаюсь клонировать набор записей ADO из запроса к базе данных в отключенный набор записей. Цель состоит в том, чтобы иметь контроль над атрибутами поля, чтобы иметь возможность изменять даже автоинкрементные значения и вычисляемые столбцы.
Код C ++ основан на рабочей функции, которую я использую в Classic ASP, и клонирование работает нормально, пока я не попытаюсь открыть новый набор записей. Затем я получаю сообщение об ошибке, в котором говорится, что соединение не может быть использовано. («Die Verbindung kann nicht verwendet werden, um diesen Vorgang auszuführen. Sie ist entweder geschlossen oder in diesem Zusammenhang ungültig.»)
Поскольку он работает в VBScript, я пытаюсь воспроизвести простой код VBScript rs.Open
без каких-либо аргументов в C ++.
Какой будет правильный синтаксис для открытия этого отключенного набора записей, созданного в коде, без подключения к базе данных?
_RecordsetPtr DataService::CloneRecordset(_RecordsetPtr rs, bool withValues)
{
_RecordsetPtr newRs;
HRESULT hr = newRs.CreateInstance(__uuidof(Recordset));
if(FAILED(hr))
return nullptr;
newRs->CursorLocation = adUseClient;
try
{
for(long i; i < rs->Fields->Count; ++i)
{
FieldPtr f = rs->Fields->GetItem(i);
long attributes = adFldIsNullable | adFldMayBeNull | adFldUpdatable;
if(f->Attributes & adFldKeyColumn)
attributes |= adFldKeyColumn;
newRs->Fields->Append(f->Name, f->Type, f->DefinedSize, (FieldAttributeEnum)attributes);
}
if(withValues)
{
newRs->putref_Source(NULL);
//Throws error
newRs->Open(vtMissing, vtMissing, adOpenUnspecified, adLockUnspecified, adCmdUnspecified);
CopyRecordset(rs, newRs);
newRs->UpdateBatch(adAffectAll);
}
return newRs;
}
catch (_com_error &ce)
{
ShowComErrorMessageBox(ce, newRs);
}
catch(...)
{
AfxMessageBox("An unknown error has occured.");
}
return nullptr;
}
Описанное сообщение об ошибке появляется, когда ни соединение, ни источник, ни поля не определены правильно. В приведенном выше коде инициализация переменной long i
пропал, отсутствует.
Меняя его на for(long i=0; i < rs->Fields->Count; ++i)
делает это работает, а также устраняет необходимость в линии newRs->putref_Source(NULL);
,