Я пытаюсь обновить запись в 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()
имеет тип 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 может использовать неправильный конструктор варианта, интерпретируя число как ячейку памяти.