我正在尝试将ADO Recordset从数据库查询克隆到断开连接的Recordset中。目标是控制字段属性,以便能够修改自动增量值和计算列。
C ++代码基于我在Classic ASP中使用的工作函数,克隆工作正常,直到我尝试打开新的Recordset。然后我收到一条错误消息,提示无法使用该连接。 (“Die Verbindung kann nicht verwendet werden,um diesenVorgangauszuführen.Sieist entweder geschlossen oder in diesemZusammenhangungültig。”)
因为它在VBScript中工作,所以我试图在C ++中重现简单的VBScript代码rs.Open
而没有任何参数。
在没有连接到数据库的情况下打开这个在代码中创建的断开连接的Recordset的正确语法是什么?
_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;
}
答案 0 :(得分:0)
如果未正确定义连接和源以及字段,则会显示所描述的错误消息。在上面的代码中,缺少变量long i
的初始化。
将其更改为for(long i=0; i < rs->Fields->Count; ++i)
会使其有效并且还会使行newRs->putref_Source(NULL);
无效。