/* * 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(); } } }