// Copyright (c) 2015-2017 schick Informatik // Description: Speicherobjekt für HIS-Nord Fehlermeldungen using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Xml; using System.IO; using System.Xml.Linq; using log4net; namespace bsmd.database { /// /// Diese Klasse bildet den Verbindungsfehler der HIS-Nord Schnittstelle ab. Damit ist ein Fehler der dazwischenliegenden /// Kommunikationsschnittstelle gemeint, der Fehler wird nicht im NSW produziert /// public class SystemError : DatabaseEntity { private static ILog _log = LogManager.GetLogger(typeof(SystemError)); public SystemError() { this.tablename = "[dbo].[SystemError]"; } #region Enums public enum SystemErrorStatus { NEW, ACKNOWLEDGED }; #endregion #region Properties public DateTime? ErrorAt { get; set; } public string Meldetype { get; set; } public string ReferenceId { get; set; } public int ProcessStatus { get; set; } public string ImportFilename { get; set; } public int ErrorCode { get; set; } public string ErrorMessage { get; set; } public string ErrorDescription { get; set; } public SystemErrorStatus Status { get; set; } public Guid MessageCoreId { get; set; } public DateTime? SendDate { get; set; } public Guid? MessageHeaderId { get; set; } #endregion #region DatabaseEntity implementation public override List LoadList(IDataReader reader) { List result = new List(); while (reader.Read()) { SystemError se = new SystemError(); se.id = reader.GetGuid(0); if (!reader.IsDBNull(1)) se.ErrorAt = reader.GetDateTime(1); if (!reader.IsDBNull(2)) se.Meldetype = reader.GetString(2); if (!reader.IsDBNull(3)) se.ReferenceId = reader.GetString(3); if (!reader.IsDBNull(4)) se.ProcessStatus = reader.GetInt32(4); if (!reader.IsDBNull(5)) se.ImportFilename = reader.GetString(5); if (!reader.IsDBNull(6)) se.ErrorCode = reader.GetInt32(6); if (!reader.IsDBNull(7)) se.ErrorMessage = reader.GetString(7); if (!reader.IsDBNull(8)) se.ErrorDescription = reader.GetString(8); if (!reader.IsDBNull(9)) se.MessageCoreId = reader.GetGuid(9); if (!reader.IsDBNull(10)) se.Status = (SystemError.SystemErrorStatus) Enum.ToObject(typeof(SystemError.SystemErrorStatus), reader.GetByte(10)); if (!reader.IsDBNull(11)) se.MessageHeaderId = reader.GetGuid(11); result.Add(se); } reader.Close(); return result; } public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria) { string query = string.Format("SELECT Id, ErrorAt, MeldeType, ReferenceId, ProcessStatus, ImportFilename, ErrorCode, ErrorMessage, ErrorDescription, MessageCoreId, Status, MessageHeaderId FROM {0} ", this.Tablename); switch (filter) { case Message.LoadFilter.BY_CORE: query += "WHERE MessageCoreId = @COREID AND Deleted = 0"; ((SqlCommand)cmd).Parameters.AddWithValue("@COREID", criteria[0]); break; case Message.LoadFilter.MESSAGEHEADER: query += "WHERE MessageHeaderId = @MHID AND Deleted = 0"; ((SqlCommand)cmd).Parameters.AddWithValue("@MHID", criteria[0]); break; case Message.LoadFilter.ALL: query += "WHERE Deleted = 0"; break; default: break; } cmd.CommandText = query; } public override void PrepareSave(IDbCommand cmd) { SqlCommand scmd = cmd as SqlCommand; scmd.Parameters.AddWithNullableValue("@EAT", this.ErrorAt); scmd.Parameters.AddWithNullableValue("@MT", this.Meldetype); scmd.Parameters.AddWithNullableValue("@REFID", this.ReferenceId); scmd.Parameters.AddWithNullableValue("@PS", this.ProcessStatus); scmd.Parameters.AddWithNullableValue("@IF", this.ImportFilename); scmd.Parameters.AddWithNullableValue("@EC", this.ErrorCode); scmd.Parameters.AddWithNullableValue("@EM", this.ErrorMessage); scmd.Parameters.AddWithNullableValue("@ED", this.ErrorDescription); scmd.Parameters.AddWithNullableValue("@MCID", this.MessageCoreId); scmd.Parameters.AddWithNullableValue("@STATUS", (byte)this.Status); scmd.Parameters.AddWithNullableValue("@MHID", this.MessageHeaderId); if (this.IsNew) { this.CreateId(); scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("INSERT INTO {0} (Id, ErrorAt, MeldeType, ReferenceId, ProcessStatus, ImportFilename, ErrorCode, ErrorMessage, ErrorDescription, MessageCoreId, Status, MessageHeaderId) " + "VALUES (@ID, @EAT, @MT, @REFID, @PS, @IF, @EC, @EM, @ED, @MCID, @STATUS, @MHID)", this.Tablename); } else { scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET ErrorAt = @EAT, MeldeType = @MT, ReferenceId = @REFID, ProcessStatus = @PS, ImportFilename = @IF, " + "ErrorCode = @EC, ErrorMessage = @EM, ErrorDescription = @ED, MessageCoreId = @MCID, Status = @STATUS, MessageHeaderId = @MHID WHERE Id = @ID", this.Tablename); } } #endregion #region public static methods public static SystemError createFromXml(XElement xml) { SystemError systemError = new SystemError(); try { if (xml.Descendants("ErrorAt").Count() > 0) { systemError.ErrorAt = DateTime.Parse(xml.Descendants("ErrorAt").FirstOrDefault().Value); } systemError.Meldetype = xml.Descendants("Meldetype").First()?.Value; systemError.ReferenceId = xml.Descendants("ReferenceId").First()?.Value; if (xml.Descendants("ProcessStatus").Count() > 0) { systemError.ProcessStatus = Int32.Parse(xml.Descendants("ProcessStatus").FirstOrDefault().Value); } systemError.ImportFilename = xml.Descendants("ImportFilename").FirstOrDefault()?.Value; if (!systemError.ImportFilename.IsNullOrEmpty()) { systemError.ImportFilename = Path.GetFileNameWithoutExtension(systemError.ImportFilename); int ind = systemError.ImportFilename.IndexOf('-'); Guid aGuid; if (Guid.TryParse(systemError.ImportFilename.Substring(ind + 1), out aGuid)) systemError.MessageCoreId = aGuid; DateTime aDate; if (DateTime.TryParse(systemError.ImportFilename.Substring(0, ind), out aDate)) systemError.SendDate = aDate; } if (xml.Descendants("ErrorCode").Count() > 0) { systemError.ErrorCode = Int32.Parse(xml.Descendants("ErrorCode").First().Value); } systemError.ErrorMessage = xml.Descendants("ErrorMessage").FirstOrDefault()?.Value; systemError.ErrorDescription = xml.Descendants("ErrorDescription").FirstOrDefault()?.Value; string coreIdString = xml.Descendants("ConveyanceCode").FirstOrDefault()?.Value; if(!coreIdString.IsNullOrEmpty()) { Guid aCoreId; if(Guid.TryParse(coreIdString, out aCoreId)) { systemError.MessageCoreId = aCoreId; } else { _log.WarnFormat("cannot parse conveyance code to Guid: {0}", coreIdString); } } } catch(Exception ex) { _log.WarnFormat("Error parsing system error: {0} ERROR-XML: {1}", ex.ToString(), xml.ToString()); } return systemError; } #endregion } }