【问题标题】:Update an integer in an ADO RecordSet in C++在 C++ 中更新 ADO RecordSet 中的整数
【发布时间】:2014-07-18 16:54:58
【问题描述】:

我正在尝试更新 ADO RecordSet 中的记录。记录集是从 XML 文件加载的,该文件以前通过 rs->Save 保存到磁盘。

当尝试分配一个整数值时,我得到一个 _com_error 异常:

HRESULT = -2147217887
Description = Fehler bei einem aus mehreren Schritten bestehenden Vorgang. Prüfen Sie die einzelnen Statuswerte.
Message = IDispatch error #3105
Source = Microsoft Cursor Engine

connections Error 集合产生相同的消息,没有其他详细信息。

我无法弄清楚为什么这项任务不起作用。 将值分配给相关字段的正确方法是什么?

通过GetValue() 从 Recordset 返回的变体是 VT_I4 类型。

但这似乎是一个转换问题。该字段不接受分配给它的变体类型。但是v = _variant_t(1l, VT_I4); 也不起作用。

_RecordsetPtr DataService::LoadRecordsetFromXML(string fileName)
{
    //get a recordset
    _RecordsetPtr rs;
    try {
        HRESULT hr = rs.CreateInstance(__uuidof(Recordset));
        if(hr)
            return nullptr;

        hr = rs->Open(fileName.c_str(),"Provider=MSPersist;",adOpenDynamic,adLockBatchOptimistic,adCmdFile);
        if(hr)
            return nullptr;
        return rs;
    }
    catch (_com_error &ce)
    {
        ShowComErrorMessageBox(ce, rs);
    }
    catch(...)
    {
        AfxMessageBox("An unknown error has occured.");
    }
    return nullptr;
}

bool DataService::AddMemoToXML(Memo m, string fileName)
{
    _RecordsetPtr rs = LoadRecordsetFromXML(fileName);
    if(!rs)
    {
        return false;
    }
    std::stringstream fstream;
    fstream << "MEMO_ID = " << m.OldId;
    try {
        rs->Filter = fstream.str().c_str();
        HRESULT hr;
        if(rs->adoEOF)
        {
            hr = rs->AddNew();
        }
        //set values
        {
            FieldPtr field;
            _bstr_t bstring;
            _variant_t v;

            field = rs->Fields->GetItem("MEMO_ID");
            v = _variant_t(m.Id);
            DataTypeEnum t = field->GetType(); //adInteger
            field->PutValue(v); //Exception here
            field->Value = v; //Exception here
            field->Value = m.Id; //Exception here

            field = rs->Fields->GetItem("MEMO_TEXT");
            bstring = m.Text.c_str();
            field->Value = bstring; //works fine
        }
        rs->Update();
        rs->Filter = "";
        bool ret = SaveRecordsetToXML(rs, fileName);
        rs->Close();
        return ret;
    }
    catch (_com_error &ce)
    {
        ShowComErrorMessageBox(ce, rs);
    }
    catch(...)
    {
        AfxMessageBox("An unknown error has occured.");
    }
    return false;
}

*edit: 备注类供参考:

class Memo
{
public:
    Memo(void);
    virtual ~Memo(void);
    int Id;
    int OldId;
    wstring Text;
    int Person;
    wstring Firma;
    int OrgId;
    int JobId;
    wstring PCode;
    int UserId;
    int RolleId;
    wstring Kat;
    COleDateTime ContactDate;
    wstring Knoten;
    wstring CodeV;
    wstring CodeR;
    wstring Eint;
    wstring Stichwort;
};

【问题讨论】:

    标签: c++ ado recordset


    【解决方案1】:

    对不同字段的进一步测试表明,如下所示的转换有效。

    field = rs->Fields->GetItem("PERSON");
    v = 10l;
    field->Value = v;
    

    v = _variant_t(1l, VT_I4); 也可以。

    错误必须与字段 MEMO_ID 的属性有关,并且可能由于它是 AutoId 列而引发。

    没有强制转换为 long 的整数可能使用了错误的变体构造函数,将数字解释为内存位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多