Обновите целое число в 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() имеет тип 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;
};

0

Решение

Дальнейшее тестирование на разных полях привело к тому, что преобразование работает следующим образом.

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

и это v = _variant_t(1l, VT_I4); тоже хорошо.

Ошибка должна быть связана со свойствами поля MEMO_ID и, вероятно, возникает из-за того, что это столбец AutoId.

Целое число без приведения к long может использовать неправильный конструктор варианта, интерпретируя число как ячейку памяти.

0

Другие решения


По вопросам рекламы [email protected]