我正在尝试更新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;
};
答案 0 :(得分:0)
对不同领域的进一步测试表明,转换如下所述。
field = rs->Fields->GetItem("PERSON");
v = 10l;
field->Value = v;
并且v = _variant_t(1l, VT_I4);
也很好。
错误必须与字段MEMO_ID的属性相关,并且可能由于它是AutoId列而引发。
没有强制转换的整数可能会使用变量的错误构造函数,将数字解释为内存位置。