Пример #1
0
        //**************************************************
        //
        // Public methods
        //
        //**************************************************

        #region Public methods


        public static DataSet ReadLog(object showObject, ExcuteDataSet excuteDataSetMethod)
        {
            var tableColumnsProperty = showObject.GetType().GetProperty("TableColumns");
            var tableNameProperty = showObject.GetType().GetProperty("TableName");
            var tableName = (string)tableNameProperty.GetValue(showObject, null);
            var columns = (string[])tableColumnsProperty.GetValue(showObject, null);
            var sql_dataset = string.Format("SELECT * FROM {0}_Log WHERE ", tableName);
            foreach (var column in columns)
            {
                var mi = showObject.GetType().GetMember(column);
                if (mi.Length > 0)
                {
                    var myAt =
                        (DataObjectFieldAttribute)
                        Attribute.GetCustomAttribute(mi[0], typeof(DataObjectFieldAttribute));
                    if (myAt != null && myAt.PrimaryKey)
                    {
                        PropertyInfo propertyInfo = showObject.GetType().GetProperty(column);
                        var value = propertyInfo.GetValue(showObject, null);
                        sql_dataset += string.Format("[{0}]=", column);
                        if (IsNumeric(propertyInfo.PropertyType))
                            sql_dataset += value + " AND ";
                        else
                            sql_dataset += "'" + value + "' AND ";
                    }
                }
            }
            sql_dataset = sql_dataset.Remove(sql_dataset.Length - 5);
            sql_dataset += " ORDER BY UpdateDate DESC";
            var dataSet = excuteDataSetMethod(CommandType.Text, sql_dataset);
            return dataSet;
        }
Пример #2
0
        /// <summary>
        /// Write log changes between two version of an oject before and after modify.
        /// </summary>
        /// <param name="originalObject">The original object to compare.</param>
        /// <param name="modifiedObject">The modified object to compare. If null => create new</param>
        /// <param name="user">The user name was made changes.</param>
        /// <param name="executeDataSetMethods">The methods to execute Dataset </param>
        public static void WriteLog(object originalObject, object modifiedObject, string user, ExcuteDataSet executeDataSetMethods)
        {
            try
            {
                var stringBuilder = new StringBuilder();

                // If create object
                if (modifiedObject == null)
                {
                    stringBuilder.AppendLine(String.Format("Create new"));
                }
                else
                {
                    // if not changes between two version
                    if (ReferenceEquals(originalObject, modifiedObject))
                    {
                        // do nothing
                        return;
                    }

                    // get all infos of versions
                    var originalInfos = originalObject.GetType()
                        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                        .Where(p => Attribute.GetCustomAttribute(p, typeof(DescriptionAttribute)) != null)
                        .ToList();
                    var modifiedInfos = modifiedObject.GetType()
                        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                        .Where(p => Attribute.GetCustomAttribute(p, typeof(DescriptionAttribute)) != null)
                        .ToList();

                    originalInfos.Sort((info, propertyInfo) => String.CompareOrdinal(info.Name, propertyInfo.Name));
                    modifiedInfos.Sort((info, propertyInfo) => String.CompareOrdinal(info.Name, propertyInfo.Name));

                    // with each property
                    for (var i = 0; i < originalInfos.Count; i++)
                    {
                        // get value of property
                        var originalValue = originalInfos[i].GetValue(originalObject, null);
                        var modifiedValue = modifiedInfos[i].GetValue(modifiedObject, null);

                        // if current property is not changes
                        if (AreValuesEqual(originalValue, modifiedValue))
                        {
                            // go next property
                            continue;
                        }
                        // append change to log
                        stringBuilder.AppendLine(String.Format("Change {0} from \"{1}\" to \"{2}\"",
                                                               originalInfos[i].Name,
                                                               originalValue,
                                                               modifiedValue));
                    }
                }

                //Create log table if not exist
                if (!string.IsNullOrEmpty(stringBuilder.ToString()))
                {
                    var tableColumnsProperty = originalObject.GetType().GetProperty("TableColumns");
                    var tableNameProperty = originalObject.GetType().GetProperty("TableName");
                    var tableName = (string)tableNameProperty.GetValue(originalObject, null);
                    var columns = (string[])tableColumnsProperty.GetValue(originalObject, null);
                    var sql = string.Format("IF OBJECT_ID('[dbo].[{0}]','U') IS NULL ", tableName + "_Log");
                    sql += string.Format("CREATE TABLE [dbo].[{0}]([LogId] [bigint] IDENTITY(1,1) NOT NULL, ",
                                         tableName + "_Log");
                    //Insert into log table
                    var insertSQL = string.Format("INSERT INTO [dbo].[{0}](", tableName + "_Log");
                    var valueSQL = "";
                    foreach (var column in columns)
                    {
                        var mi = originalObject.GetType().GetMember(column);
                        if (mi.Length > 0)
                        {
                            var myAt =
                                (DataObjectFieldAttribute)
                                Attribute.GetCustomAttribute(mi[0], typeof(DataObjectFieldAttribute));
                            if (myAt != null && myAt.PrimaryKey)
                            {
                                var sql_dataset =
                                    string.Format(
                                        "SELECT '[' +COLUMN_NAME+'] ['+  DATA_TYPE +  '] ('+ CAST(ISNULL(CHARACTER_MAXIMUM_LENGTH,'')  AS NVARCHAR)+' ) ' + CASE IS_NULLABLE WHEN 'YES' THEN 'NULL' ELSE 'NOT NULL, ' END  FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME='{0}'  AND TABLE_NAME='{1}'",
                                        column, tableName);
                                var dataSet = executeDataSetMethods(CommandType.Text, sql_dataset);
                                sql += dataSet.Tables[0].Rows[0][0].ToString();
                                insertSQL += "[" + column + "],";
                                PropertyInfo propertyInfo = originalObject.GetType().GetProperty(column);
                                var value = propertyInfo.GetValue(originalObject, null);
                                if (IsNumeric(propertyInfo.PropertyType))
                                    valueSQL += value + ",";
                                else
                                    valueSQL += "'" + value + "',";
                            }
                        }
                    }
                    insertSQL += "[UpdateUser],[UpdateDate],[LogMessage]) VALUES(";
                    sql +=
                        string.Format(
                            "[UpdateUser] [nvarchar](50) NULL,[UpdateDate] [datetime] NOT NULL,[LogMessage] [nvarchar](250) NULL, CONSTRAINT [PK_{0}] PRIMARY KEY CLUSTERED ",
                            tableName + "_Log");
                    sql +=
                        "([LogId] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY] ";
                    valueSQL += string.Format("'{0}','{1}','{2}')", user, DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
                                              stringBuilder);
                    executeDataSetMethods(CommandType.Text, sql);
                    executeDataSetMethods(CommandType.Text, insertSQL + valueSQL);
                }
                //// Write log to text file
                //Stream str = new FileStream("\\" + "logger.txt",
                //                            FileMode.Append,
                //                            FileAccess.Write,
                //                            FileShare.ReadWrite);
                //var data = Encoding.UTF8.GetBytes(stringBuilder.ToString());
                //str.Write(data, 0, data.Length);
                //str.Close();

            }
            catch (Exception)
            {

            }
        }