构建日志和打印日志的逻辑类 - RecordLog

2017-05-02 14:55:33  访问(4977) 赞(0) 踩(0)

using Oracle.ManagedDataAccess.Client;
using SlowX.DAL.Classes;
using SlowX.DAL.IRecorder;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
// using System.Data.OracleClient;
using System.Data.SqlClient;
using System.Text;

namespace SlowX.DAL.Recorder
{
    /// <summary>
    /// 构建日志和打印日志的逻辑类
    /// </summary>
    public class RecordLog
        :
        IRecordLog
    {
        /// <summary>
        /// 是否允许日志
        /// </summary>
        public readonly static bool _EnabledLog 
            = 
            System.Configuration.ConfigurationManager.AppSettings["SlowX.DAL.Recorder.RecordLog.EnabledLog"] == "1";

        /// <summary>
        /// 只能用保护,不然反射不到
        /// </summary>
        protected static IRecordLog m_instance = null;

        /// <summary>
        /// typeof(SqlParameter)
        /// </summary>
        public readonly static Type SqlParameterType = typeof(SqlParameter);

        /// <summary>
        /// (OracleParameter)
        /// </summary>
        public readonly static Type OracleParameterType 
            = typeof(OracleParameter);

        /// <summary>
        /// typeof(OleDbParameter)
        /// </summary>
        public readonly static Type OleDbParameterType = typeof(OleDbParameter);

        /// <summary>
        /// 空格 制表符 空格
        /// </summary>
        public readonly static string STR_BLANK_TAB_BLANK = " " + '\t' + " ";

        /// <summary>
        /// 设置静态实体
        /// </summary>
        /// <param name="_instance"></param>
        public static void SetInstance(IRecordLog _instance)
        {
            m_instance = null;

            m_instance = _instance;
        }

        /// <summary>
        /// 静态实体
        /// </summary>
        public static IRecordLog instance
        {
            get
            {
                return m_instance;
            }
        }

        /// <summary>
        /// 网站常用的逻辑
        /// </summary>
        public RecordLog()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        /// <summary>
        /// 是否允许日志
        /// </summary>
        public virtual bool EnabledLog
        {
            get
            {
                return _EnabledLog;
            }
        }

        /// <summary>
        /// 写入日志(需要继承)
        /// </summary>
        /// <param name="logItem"></param>
        public virtual void WriteLog(SqlLogItem logItem)
        {
            return;
        }


        /// <summary>
        /// object转成SqlServer格式的时间 - SqlServerConvertDateTimeToSQL +
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string SqlServerConvertDateTimeToSQL
                (
                    object obj
                )
        {
            if (obj == DBNull.Value || obj == null || obj.ToString().Length == 0)
                return "";

            return " convert(datetime,'" + Convert.ToDateTime(obj).ToString("yyyy-MM-dd HH:mm:ss") + "',20) ";
        }

        /// <summary>
        /// object转成Oracle格式的时间 - OracleConvertDateTimeToSQL +
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string OracleConvertDateTimeToSQL
                (
                    object obj
                )
        {
            if (obj == DBNull.Value || obj == null || obj.ToString().Length == 0)
                return "";

            return " to_date('" + Convert.ToDateTime(obj).ToString("yyyy-MM-dd HH:mm:ss") + "','yyyy-mm-dd hh24:mi:ss') ";

        }

        /// <summary>
        /// object转换成Access格式的时间 - AccessConvertDateTimeToSQL +
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public string AccessConvertDateTimeToSQL
                (
                    object obj
                )
        {
            if (obj == DBNull.Value || obj == null || obj.ToString().Length == 0)
                return "";

            return " cdate('" + Convert.ToDateTime(obj).ToString("yyyy-MM-dd HH:mm:ss") + "') ";
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="SQL"></param>
        /// <param name="commandParameters"></param>
        /// <returns></returns>
        public SqlContext BuildSqlContext(string SQL, IDataParameter[] commandParameters)
        {
            if(SQL==null||SQL.Length == 0)
                return null;

            SqlContext theResult = new SqlContext();

            theResult.SQL = SQL;

            string dateTimeValue = string.Empty;
            

            // 添加调试用的SQL语句 //
            if (commandParameters != null && commandParameters.Length > 0)
            {
                string convertSQL = SQL;

                StringBuilder stringBuilderParams = new StringBuilder();
                StringBuilder sqlParams = new StringBuilder();

                foreach (IDataParameter param in commandParameters)
                {
                    if (param == null)
                        continue;

                    sqlParams.Append(param.ParameterName);
                    sqlParams.Append(STR_BLANK_TAB_BLANK);

                    if (param.Value == DBNull.Value || param.Value == null)
                        sqlParams.Append("$DBNull.Value");
                    else
                        sqlParams.Append(param.Value.ToString());

                    sqlParams.Append(STR_BLANK_TAB_BLANK);
                    sqlParams.Append(param.DbType.ToString());

                    sqlParams.Append(STR_BLANK_TAB_BLANK);
                    sqlParams.Append(param.Direction.ToString());

                    sqlParams.Append(STR_BLANK_TAB_BLANK);
                    sqlParams.AppendLine(param.GetType().Name);

                    // 这里执行替换,会有问题 //
                    if (param.Value == System.DBNull.Value)
                    {
                        convertSQL = convertSQL.Replace(param.ParameterName, "null");

                        stringBuilderParams.Append(param.ParameterName);
                        stringBuilderParams.Append(" = null");
                    }
                    else if (param.DbType == DbType.Int32 || param.DbType == DbType.Int64 || param.DbType == DbType.Int16)
                    {
                        convertSQL = convertSQL.Replace(param.ParameterName, param.Value.ToString());

                        stringBuilderParams.Append(param.ParameterName);
                        stringBuilderParams.Append(" = ");
                        stringBuilderParams.Append(param.Value.ToString());
                    }
                    else if (param.DbType == DbType.DateTime || param.DbType == DbType.DateTime2) // || DateTimeFunctions.IsDateTimeType(param.Value))
                    {
                        // 转义成时间 //
                        Type t = param.GetType();

                        try
                        {
                            if (t == SqlParameterType)
                            {
                                dateTimeValue = SqlServerConvertDateTimeToSQL(param.Value);
                            }
                            else if (t == OracleParameterType)
                            {
                                dateTimeValue = OracleConvertDateTimeToSQL(param.Value);
                            }
                            else if (t == OleDbParameterType)
                            {
                                dateTimeValue = AccessConvertDateTimeToSQL(param.Value);
                            }
                            else
                            {
                                dateTimeValue = "'" + param.Value.ToString().Replace("'", "''") + "'";
                            }
                        }
                        catch (Exception err)
                        {
                            dateTimeValue = "'[发生异常:" + err.Message + "]'";
                        }

                        convertSQL = convertSQL.Replace(param.ParameterName, dateTimeValue);

                        stringBuilderParams.Append(param.ParameterName);
                        stringBuilderParams.Append(" = ");
                        stringBuilderParams.Append(dateTimeValue);
                    }
                    else
                    {
                        convertSQL = convertSQL.Replace(param.ParameterName, "'" + param.Value.ToString().Replace("'", "''") + "'");

                        stringBuilderParams.Append(param.ParameterName);
                        stringBuilderParams.Append(" = '");
                        stringBuilderParams.Append(param.Value.ToString().Replace("'", "''"));
                        stringBuilderParams.Append("'");
                    }

                    stringBuilderParams.AppendLine();
                }

                theResult.ConvertSQL = convertSQL;
                theResult.ConvertParams = stringBuilderParams.ToString();
                theResult.SQLParams = sqlParams.ToString();
            }

            return theResult;
        }

        /// <summary>
        /// 构建SQL语句
        /// </summary>
        /// <param name="SQL"></param>
        /// <param name="commandParameters"></param>
        /// <returns></returns>
        public SqlContext BuildSqlContextByList
            (
                string SQL, 
                List<IDataParameter> commandParameters
            )
        {
            if (SQL == null || SQL.Length == 0)
                return null;

            SqlContext theResult = new SqlContext();

            theResult.SQL = SQL;

            string dateTimeValue = string.Empty;


            // 添加调试用的SQL语句 //
            if (commandParameters != null && commandParameters.Count > 0)
            {
                string convertSQL = SQL;

                StringBuilder stringBuilderParams = new StringBuilder();
                StringBuilder sqlParams = new StringBuilder();

                foreach (IDataParameter param in commandParameters)
                {
                    if (param == null)
                        continue;

                    sqlParams.Append(param.ParameterName);
                    sqlParams.Append(STR_BLANK_TAB_BLANK);

                    if (param.Value == DBNull.Value || param.Value == null)
                        sqlParams.Append("$DBNull.Value");
                    else
                        sqlParams.Append(param.Value.ToString());

                    sqlParams.Append(STR_BLANK_TAB_BLANK);
                    sqlParams.Append(param.DbType.ToString());

                    sqlParams.Append(STR_BLANK_TAB_BLANK);
                    sqlParams.Append(param.Direction.ToString());

                    sqlParams.Append(STR_BLANK_TAB_BLANK);
                    sqlParams.AppendLine(param.GetType().Name);

                    // 这里执行替换,会有问题 //
                    if (param.Value == System.DBNull.Value)
                    {
                        convertSQL = convertSQL.Replace(param.ParameterName, "null");

                        stringBuilderParams.Append(param.ParameterName);
                        stringBuilderParams.Append(" = null");
                    }
                    else if (param.DbType == DbType.Int32 || param.DbType == DbType.Int64 || param.DbType == DbType.Int16)
                    {
                        convertSQL = convertSQL.Replace(param.ParameterName, param.Value.ToString());

                        stringBuilderParams.Append(param.ParameterName);
                        stringBuilderParams.Append(" = ");
                        stringBuilderParams.Append(param.Value.ToString());
                    }
                    else if (param.DbType == DbType.DateTime || param.DbType == DbType.DateTime2) // || DateTimeFunctions.IsDateTimeType(param.Value))
                    {
                        // 转义成时间 //
                        Type t = param.GetType();

                        try
                        {
                            if (t == SqlParameterType)
                            {
                                dateTimeValue = SqlServerConvertDateTimeToSQL(param.Value);
                            }
                            else if (t == OracleParameterType)
                            {
                                dateTimeValue = OracleConvertDateTimeToSQL(param.Value);
                            }
                            else if (t == OleDbParameterType)
                            {
                                dateTimeValue = AccessConvertDateTimeToSQL(param.Value);
                            }
                            else
                            {
                                dateTimeValue = "'" + param.Value.ToString().Replace("'", "''") + "'";
                            }
                        }
                        catch (Exception err)
                        {
                            dateTimeValue = "'[发生异常:" + err.Message + "]'";
                        }

                        convertSQL = convertSQL.Replace(param.ParameterName, dateTimeValue);

                        stringBuilderParams.Append(param.ParameterName);
                        stringBuilderParams.Append(" = ");
                        stringBuilderParams.Append(dateTimeValue);
                    }
                    else
                    {
                        convertSQL = convertSQL.Replace(param.ParameterName, "'" + param.Value.ToString().Replace("'", "''") + "'");

                        stringBuilderParams.Append(param.ParameterName);
                        stringBuilderParams.Append(" = '");
                        stringBuilderParams.Append(param.Value.ToString().Replace("'", "''"));
                        stringBuilderParams.Append("'");
                    }

                    stringBuilderParams.AppendLine();
                }

                theResult.ConvertSQL = convertSQL;
                theResult.ConvertParams = stringBuilderParams.ToString();
                theResult.SQLParams = sqlParams.ToString();
            }

            return theResult;
        }

        /// <summary>
        /// 构建日志内容
        /// </summary>
        /// <param name="logItem"></param>
        /// <returns></returns>
        public string BuildLog(SqlLogItem logItem)
        {
            if (logItem == null || logItem._SqlContextValue==null)
                return "";

            StringBuilder theResult = new StringBuilder();
            
            if(logItem.IsException)
                theResult.Append("[异常]");

            if(logItem.IsTransaction)
                theResult.Append("[事务]");

            theResult.AppendLine(logItem.EmExecuteTypeValue.ToString() + " ==> " + logItem.ConnectionString);
            theResult.AppendLine();

            if (logItem._SqlContextValue.ConvertSQL.Length > 0)
            {
                theResult.AppendLine(logItem._SqlContextValue.ConvertSQL);
                theResult.AppendLine();
            }

            if (logItem._SqlContextValue.ConvertParams.Length > 0)
            {
                theResult.AppendLine(logItem._SqlContextValue.ConvertParams);
                theResult.AppendLine();
            }

            theResult.AppendLine(logItem._SqlContextValue.SQL);
            theResult.AppendLine();

            if (logItem._SqlContextValue.SQLParams.Length > 0)
            {
                theResult.AppendLine(logItem._SqlContextValue.SQLParams);
                theResult.AppendLine();
            }

            theResult.AppendLine("[执行时间]:" + (logItem.EndTime - logItem.StartTime).ToString() + ",开始时间:" + logItem.StartTime.ToString() + " ~ 结束时间:" + logItem.StartTime.ToString());
            theResult.AppendLine(logItem.Message);

            return theResult.ToString();
        }
    }
}


标签:构建日志和打印日志的逻辑类 - RecordLog 

上一条:

下一条:


 

相关评论

评论加载中……
 

发表评论

类型:
内容:
  (Alt+Enter)