用C ++打开一个断开连接的ADO Recordset

时间:2014-08-01 09:58:41

标签: c++ ado recordset

我正在尝试将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;
}

1 个答案:

答案 0 :(得分:0)

如果未正确定义连接和源以及字段,则会显示所描述的错误消息。在上面的代码中,缺少变量long i的初始化。

将其更改为for(long i=0; i < rs->Fields->Count; ++i)会使其有效并且还会使行newRs->putref_Source(NULL);无效。