/// <summary> /// Обновление данных из citect в указанной таблице согласно биндлиста /// </summary> /// <param name="connectId">Идентификатор соединения</param> /// <param name="xpathbind">xpath-запрос до биндлиста</param> /// <param name="xdoc">Имя Xml-файла с полным путем</param> /// <param name="suff">Суффикс, добавляемый к названию тэга или объекта</param> /// <param name="sztable">Имя таблицы <remarks>Если пустая строка, то берем из биндлиста</remarks></param> /// <returns>Код возврата (=0 - good, другие - неудача)</returns> /// <remarks>Идентификатор connectId был получен oconnect()</remarks> public int oupdate(int connectId, string xpathbind, string xdoc, int suff = 0, string sztable = "") { int rc = (int)constants.err.e_fault; uint cihndl = 0; var _table = sztable; try { if (xdoc != "") { bool _fCi = false; string _ask = "UPDATE {0} set {1} WHERE {2}"; StringBuilder _vals = new StringBuilder(); StringBuilder _where = new StringBuilder(); var x = new XmlDocument(); x.Load(xdoc); var xn = x.SelectSingleNode(xpathbind); if (_table.Length == 0) { _table = xn.Attributes.GetNamedItem("table").Value; } cihndl = CTAPI.ctOpen("", "", "", CTAPI.CT_OPEN_BATCH); foreach (XmlNode it in xn.ChildNodes) { string _var = it.Attributes.Item(0).Value.Trim(); string _apo = _removeApo(ref _var); _var = _addSuffix(_var, suff); string _col = it.Attributes.Item(1).Value.Trim(); StringBuilder pval = new StringBuilder(256); _fCi |= CTAPI.ctTagRead(cihndl, _var, pval, 128); if (it.Name.ToLower().Trim() == "item") { _vals.AppendFormat("{0} = {1}{2}{1}, ", _col, _apo, pval.ToString()); } else if (it.Name.ToLower().Trim() == "where") { _where.Remove(0, _where.Length); _where.AppendFormat("{0} = {1}", _col, pval.ToString()); } } _vals = _vals.Remove(_vals.ToString().LastIndexOf(','), _vals.Length - _vals.ToString().LastIndexOf(',')); string mess = string.Format("Citect variables readed {0}", (_fCi ? "successfully" : "unsuccessfully")); if (!_fCi) { logerr(mess); } //else if ((fLog & 1) != 0) log(mess); _ask = String.Format(_ask, _table, _vals.ToString(), _where.ToString()); rc = oexecute(connectId, _ask, ""); } } catch (Exception e) { logerr("Ошибка обновления данных биндлиста {B} в таблице {T} подключения #{CONID} - {eName}: {e:Desc}", xpathbind, _table, connectId, e.GetType().Name, e.Message); } finally { CTAPI.ctClose(cihndl); } return(rc); }
/// <summary> /// Вставка новых данных из citect в указанную таблицу согласно биндлиста /// </summary> /// <param name="connectId">Идентификатор соединения</param> /// <param name="xpathbind">xpath-запрос до биндлиста</param> /// <param name="xdoc">Имя Xml-файла с полным путем</param> /// <param name="suff">Суффикс, добавляемый к названию тэга или объекта</param> /// <param name="sztable">Имя таблицы <remarks>Если пустая строка, то берем из биндлиста</remarks></param> /// <returns>Код возврата (=0 - good, другие - неудача)</returns> /// <remarks>Идентификатор connectId был получен oconnect()</remarks> public int oinsert(int connectId, string xpathbind, string xdoc, int suff = 0, string sztable = "") { int rc = (int)constants.err.e_fault; uint cihndl = 0; var _table = sztable; try { if (xdoc != "") { bool _fCi = false; cihndl = CTAPI.ctOpen("", "", "", CTAPI.CT_OPEN_BATCH); string _ask = "INSERT INTO {0} ({1}) VALUES ({2})"; StringBuilder _cols = new StringBuilder(); StringBuilder _vals = new StringBuilder(); var x = new XmlDocument(); x.Load(xdoc); var xn = x.SelectSingleNode(xpathbind); if (_table.Length == 0) { _table = xn.Attributes.GetNamedItem("table").Value; } foreach (XmlNode it in xn.ChildNodes) { string _var = it.Attributes.Item(0).Value.Trim(); string _apo = _removeApo(ref _var); _var = _addSuffix(_var, suff); string _col = it.Attributes.Item(1).Value.Trim(); StringBuilder pval = new StringBuilder(256); _fCi |= CTAPI.ctTagRead(cihndl, _var, pval, 128); _cols.AppendFormat("{0}, ", _col); _vals.AppendFormat("{0}{1}{0}, ", _apo, pval.ToString()); } _vals = _vals.Remove(_vals.ToString().LastIndexOf(','), _vals.Length - _vals.ToString().LastIndexOf(',')); _cols = _cols.Remove(_cols.ToString().LastIndexOf(','), _cols.Length - _cols.ToString().LastIndexOf(',')); string mess = string.Format("Citect variables readed {0}", (_fCi ? "successfully" : "unsuccessfully")); if (!_fCi) { logerr(mess); } //else if ((fLog & 1) != 0) log(mess); _ask = String.Format(_ask, _table, _cols.ToString(), _vals.ToString()); rc = oexecute(connectId, _ask, ""); } } catch (Exception e) { logerr("Ошибка вставки данных биндлиста {B} в таблицу {T} подключения #{CONID} - {eName}: {e:Desc}", xpathbind, _table, connectId, e.GetType().Name, e.Message); } finally { // Marshal.FreeCoTaskMem(pval); // ciInterop.ctClose(cihndl); CTAPI.ctClose(cihndl); } return(rc); }
/// <summary> /// Получение строки данных из выборки и запись в тэги Citect /// </summary> /// <param name="stmtId">Идентификатор запроса</param> /// <param name="recOff">Номер выбираемой записи</param> /// <param name="suff">Суффикс, добавляемый к имени тэга или объекта</param> /// <returns>Код возврата (=0 - good, другие - неудача)</returns> /// <remarks>Идентификатор stmtId был получен osetstatement()</remarks> public int ogetrecord(int stmtId, int recOff = 0, int suff = 0) { int rc = (int)constants.err.e_fault; uint cihndl = 0; try { var _st = m_ost.First(m => m._id == stmtId); if (_st._dt.Rows.Count != 0) { bool _fCi = false; cihndl = CTAPI.ctOpen("", "", "", CTAPI.CT_OPEN_BATCH); StringBuilder _vars = new StringBuilder(); StringBuilder _cols = new StringBuilder(); StringBuilder _out = new StringBuilder(); string _sfmt = "|{0,-15}"; foreach (var col in _st._binds) { string _var = _addSuffix((string)col._tkey, suff); _vars.AppendFormat(_sfmt, _var); _cols.AppendFormat(_sfmt, (string)col._tvalue); string _val = _st._dt.Rows[recOff][col._tvalue].ToString(); // _val = _val.Replace(',', '.'); _fCi |= CTAPI.ctTagWrite(cihndl, _var, _val); _out.AppendFormat(_sfmt, _val); } if ((fLog & 1) != 0 || _st._log) { log("{variables}", _vars); log("{columns}", _cols); log("{values}", _out); } string mess = string.Format("Citect variables writed {0}", (_fCi ? "successfully" : "unsuccessfully")); if (!_fCi) { logerr(mess); } //else if ((fLog & 1) != 0) log(mess); rc = (_fCi) ? (int)constants.err.s_ok : (int)constants.err.e_noitems; } } catch (OracleException e) { logerr("Ошибка выборки записи '{A}' запроса {B} - {eName}: {e:Desc}", recOff, stmtId, e.GetType().Name, e.Message); } catch (Exception e) { logerr("Ошибка выборки записи '{A}' запроса {B} - {eName}: {e:Desc}", recOff, stmtId, e.GetType().Name, e.Message); } finally { CTAPI.ctClose(cihndl); } return(rc); }
/// <summary> /// Получение набора строк данных из выборки и запись в тэги Citect /// </summary> /// <param name="stmtId">Идентификатор запроса</param> /// <param name="recOff">Номер первой выбираемой записи</param> /// <param name="recOffLast">Номер последней выбираемой записи</param> /// <returns>Код возврата (=0 - good, другие - неудача)</returns> /// <remarks>Идентификатор stmtId был получен osetstatement()</remarks> public int ogetrecordset(int stmtId, int recOff = 1, int recOffLast = 0) { int rc = (int)constants.err.e_fault; uint cihndl = 0; // CTOVERLAPPED lpOv = new CTOVERLAPPED(); try { var _st = m_ost.First(m => m._id == stmtId); if (_st._dt.Rows.Count != 0) { bool _fCi = false; cihndl = CTAPI.ctOpen("", "", "", CTAPI.CT_OPEN_BATCH); StringBuilder _vars = new StringBuilder(); StringBuilder _cols = new StringBuilder(); StringBuilder _out = new StringBuilder(); // StringBuilder _wr = new StringBuilder(); // StringBuilder _res = new StringBuilder(); string _sfmt = "|{0,-15}"; for (int nrow = recOff; nrow > 0 && nrow <= recOffLast; nrow++) { _vars.Clear(); _cols.Clear(); _out.Clear(); foreach (var col in _st._binds) { string _var = _addSuffix((string)col._tkey, nrow); _vars.AppendFormat(_sfmt, _var); _cols.AppendFormat(_sfmt, (string)col._tvalue); string _val = _st._dt.Rows[nrow - 1][col._tvalue].ToString(); // _wr.Clear(); // _wr.AppendFormat("TagWrite(\"{0}\", \"{1}\"", _var, _val); // CTAPI.ctCicode(cihndl, _wr.ToString(), 0, 0, _res, 0, IntPtr.Zero); _fCi |= CTAPI.ctTagWrite(cihndl, _var, _val); _out.AppendFormat(_sfmt, _val); } if (nrow == recOff) { log("{columns}", _cols.ToString()); } log("{variables}", _vars.ToString()); log("{values}", _out.ToString()); } string mess = string.Format("Citect variables writed {0}", (_fCi ? "successfully" : "unsuccessfully")); if (!_fCi) { logerr(mess); } else if ((fLog & 1) != 0) { log(mess); } rc = (_fCi) ? (int)constants.err.s_ok : (int)constants.err.e_noitems; } } catch (OracleException e) { logerr("Ошибка выборки записи '{A}' запроса {B} - {eName}: {e:Desc}", recOff, stmtId, e.GetType().Name, e.Message); } catch (Exception e) { logerr("Ошибка выборки записи '{A}' запроса {B} - {eName}: {e:Desc}", recOff, stmtId, e.GetType().Name, e.Message); } finally { CTAPI.ctClose(cihndl); } return(rc); } /// <summary>