在C ++中更新ADO RecordSet中的整数

时间:2014-07-15 11:01:07

标签: c++ ado recordset

我正在尝试更新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

连接错误集合产生相同的消息,没有其他详细信息。

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

通过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;
};

1 个答案:

答案 0 :(得分:0)

对不同领域的进一步测试表明,转换如下所述。

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

并且v = _variant_t(1l, VT_I4);也很好。

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

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