/*
* Copyright 2006 Jozef Izso
*
* Zdrojový kód je možné použiť ako inšpiráciu.
*
* */
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace izsaknet.Logging
{
///
/// Trieda SimpleSqlLogItem formátuje do logovacieho výstupu informácie
/// o objekte .
///
///
/// Ukážka formátovaného výstupu:
///
///
/// [Log message] Nepodarilo sa získať informácie o užívateľovi.
/// [SQL Command] SELECT id, meno, email FROM uzivatelia WHERE id = @ID AND meno = @meno
/// [param] int @ID = 1
/// [param] varchar meno = 'Administáror'
///
/// [Connection] DBSERVER\SQLEXPRESS:UkazkovaDB (Open)
///
///
/// Formátovanie zatiaľ plne nepodporuje uložené procedúry.
///
public class SimpleSqlLogItem : SimpleLogItem
{
private SqlCommand _sql;
public SimpleSqlLogItem(SqlCommand command, string message)
: this(command, message, null)
{ }
public SimpleSqlLogItem(SqlCommand command, string message, params object[] args)
: base(message, args)
{
_sql = command;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder(30);
// append log message
sb.AppendLine(base.ToString());
sb.Append("[SQL Command] ");
if (this._sql == null)
{
sb.Append("(null)");
}
else
{
sb.AppendLine(this._sql.CommandText);
// output SQL Command parameters
if (this._sql.Parameters != null)
{
foreach (SqlParameter param in this._sql.Parameters)
{
// [out NULL param] Int ID = 2
// [param] varchar Name = 'Jozef'
sb.AppendFormat("\t[{0}param] {1} {2} = {3}",
FormatParameterType(param),
param.DbType,
param.ParameterName,
FormatParameterValue(param)
);
sb.AppendLine();
}
sb.AppendLine();
}
sb.Append("\t[Connection] ");
SqlConnection conn = this._sql.Connection;
if (conn == null)
{
sb.Append("(null)");
}
else
{
sb.AppendFormat("{0}\\{1}:{2} ({3})",
conn.WorkstationId,
conn.DataSource,
conn.Database,
conn.State
);
}
sb.AppendLine();
}
return sb.ToString();
}
private string FormatParameterType(SqlParameter param)
{
StringBuilder sb = new StringBuilder();
switch (param.Direction)
{
case ParameterDirection.Output:
sb.Append("out");
break;
case ParameterDirection.ReturnValue:
sb.Append("return");
break;
case ParameterDirection.InputOutput:
sb.Append("in/out");
break;
}
// indicates nullable parameter
if (param.IsNullable)
{
sb.Append(" NULL");
}
return sb.ToString();
}
private string FormatParameterValue(SqlParameter param)
{
if (param.Value == null)
return "(null)";
if (param.Value is DBNull)
return "(NULL)";
// enclose string paramter in apostrophe
if (param.Value is string)
return String.Concat("'", param.Value.ToString().Replace("'", "''"), "'");
return param.Value.ToString();
}
}
}