繁体   English   中英

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

[英]Update an integer in an ADO RecordSet in C++

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

连接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;
}

*编辑:备忘类供参考:

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

在不同领域的进一步测试得出的转换效果如下。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM