【发布时间】:2014-08-01 09:58:41
【问题描述】:
我正在尝试将 ADO 记录集从数据库查询克隆到断开连接的记录集中。目标是控制字段属性,以便能够修改自动增量值和计算列。
C++ 代码基于我在 Classic ASP 中使用的一个工作函数,并且克隆工作正常,直到我尝试打开新的 Recordset。然后我收到一条错误消息,说无法使用连接。 (“Die Verbindung kann nicht verwendet werden, um diesen Vorgang auszuführen。Sie ist entweder geschlossen oder in diesem Zusammenhang ungültig。”)
由于它在 VBScript 中工作,我试图在 C++ 中不带任何参数地重现简单的 VBScript 代码rs.Open。
打开这个断开连接的记录集的正确语法是什么,它是在代码中创建的,没有与数据库的连接?
_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;
}
【问题讨论】: