Cześć,
piszę sobie obsługę błędów (logowanie). W solucji jest ok. 30 projektów, ja chce dodać swój właśnie z logowaniem błędów do DB.
Problem jest taki, że Obsługa DB jest przykładowo w projekcie DB, więc mam do mojego projektu z logami zrobioną referencję. Wszystko działa ok, dopóki nie chcę dodać logu z projektu z DB. Wtedy dostaję informację, że zrobiła się pętla referencji.
Gdzie jest błąd w moim myśleniu?
Klasa Log.cs:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Logger
{
public class Log
{
/// <summary>
/// Moduł,w którym wystąpił błąd
/// </summary>
public string UID;
/// <summary>
/// Moduł,w którym wystąpił błąd
/// </summary>
public string Modul;
/// <summary>
/// StackTrace błędu
/// </summary>
public string StackTrace;
/// <summary>
/// Wiadomość (Exception.Message)
/// </summary>
public string Wiadomosc;
/// <summary>
/// Konstruktor
/// </summary>
public Log()
{}
/// <summary>
/// Konstruktor z <see cref="Dictionary"/>
/// </summary>
public Log(Dictionary<string, string> logDict)
{
this.Modul = logDict["modul"];
this.StackTrace = logDict["stackTrace"];
this.Wiadomosc = logDict["Wiadomosc"];
}
public void DodajLog(Exception ex)
{
this.StackTrace = ex.StackTrace;
this.Wiadomosc = ex.Message;
this.Modul = ex.Source;
var logsDict = new Dictionary<string, string>
{
{ "modul", this.Modul },
{ "stackTrace", this.StackTrace },
{ "Wiadomosc", this.Wiadomosc }
};
this.UID = new CDaoLogger().ZapiszLog(logsDict);
if (!String.IsNullOrEmpty(this.UID))
WyswietlInformacje(this.UID);
}
/// <summary>
/// Wyświetla informacje o błędzie użytkownikowi
/// </summary>
/// <param name="UID">Unikalny identyfikator błędu</param>
private void WyswietlInformacje(string UID)
{
MessageBox.Show(String.Format("Wystąpił niespodziewany błąd. Spróbuj ponownie. Jeżeli problem będzie się powtarzał - skontaktuj się z administratorem i podaj identyfikator błędu: {1}{0}", UID, Environment.NewLine),
"Houston, mamy problem",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
Klasa CDao:
using Ripper.Businesslogic.Dao;
using Ripper.Dao;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
namespace Logger
{
public class CDaoLogger : Connection
{
public string ZapiszLog(Dictionary<string,string> log)
{
DataTable dt = new DataTable();
string UID = String.Empty;
Log logItem = new Log(log);
CDaoAutoryzacja daoUser = new CDaoAutoryzacja();
GenericPermissions.PermissionManager pm = daoUser.getPermissionManager();
int UserId = Convert.ToInt32(pm.getCurrentlyLoggedUser().GeUserId);
Hashtable htParametry = new Hashtable
{
{ "@lg_modul", logItem.Modul },
{ "@lg_stackTrace", logItem.StackTrace },
{ "@lg_wiadomosc", logItem.Wiadomosc },
{ "@lg_us_id", UserId }
};
try
{
this.Open();
DataRow dr = Helpers.PobierzWiersz("[dbo].[Logs_dodaj]", htParametry);
if (dr != null)
UID = Convert.ToString(dr[0]);
}
catch (Exception e)
{
System.Windows.Forms.MessageBox.Show(e.ToString());
}
finally
{
if (this.SqlTran == null && this.SqlConn != null)
{
this.Close();
}
}
return UID;
}
}
}