diff --git a/Src/Asp.Net/SqlSugar/Abstract/AdoProvider/AdoProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/AdoProvider/AdoProvider.cs index e167dc509..f52c7cc1a 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/AdoProvider/AdoProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/AdoProvider/AdoProvider.cs @@ -40,6 +40,7 @@ namespace SqlSugar internal bool OldClearParameters { get; set; } public IDataParameterCollection DataReaderParameters { get; set; } public TimeSpan SqlExecutionTime { get { return AfterTime - BeforeTime; } } + public StackTraceInfo SqlStackTrace { get { return UtilMethods.GetStackTrace(); } } public bool IsDisableMasterSlaveSeparation { get; set; } internal DateTime BeforeTime = DateTime.MinValue; internal DateTime AfterTime = DateTime.MinValue; diff --git a/Src/Asp.Net/SqlSugar/Entities/StackTraceInfo.cs b/Src/Asp.Net/SqlSugar/Entities/StackTraceInfo.cs new file mode 100644 index 000000000..827564100 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Entities/StackTraceInfo.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class StackTraceInfo + { + public string FirstFileName { get { return this.MyStackTraceList.First().FileName; } } + public string FirstMethodName { get { return this.MyStackTraceList.First().MethodName; } } + public int FirstLine { get { return this.MyStackTraceList.First().Line; } } + + public List MyStackTraceList { get; set; } + public List SugarStackTraceList { get; set; } + } + public class StackTraceInfoItem + { + public string FileName { get; set; } + public string MethodName { get; set; } + public int Line { get; set; } + } +} diff --git a/Src/Asp.Net/SqlSugar/Interface/IAdo.cs b/Src/Asp.Net/SqlSugar/Interface/IAdo.cs index df2cbe4e8..0b07c5e6e 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IAdo.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IAdo.cs @@ -21,7 +21,7 @@ namespace SqlSugar void ExecuteBefore(string sql, SugarParameter[] pars); void ExecuteAfter(string sql, SugarParameter[] pars); bool IsEnableLogEvent{get;set;} - + StackTraceInfo SqlStackTrace { get; } IDataParameterCollection DataReaderParameters { get; set; } CommandType CommandType { get; set; } diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 5620c5fef..149acff2e 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -88,6 +88,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs index 2563616ed..ce7c38be5 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; +using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; @@ -19,7 +20,7 @@ namespace SqlSugar { return To(value, destinationType, CultureInfo.InvariantCulture); } - + internal static object To(object value, Type destinationType, CultureInfo culture) { if (value != null) @@ -44,6 +45,38 @@ namespace SqlSugar return value; } + public static StackTraceInfo GetStackTrace() + { + + StackTrace st = new StackTrace(true); + StackTraceInfo info = new StackTraceInfo(); + info.MyStackTraceList = new List(); + info.SugarStackTraceList = new List(); + for (int i = 0; i < st.FrameCount; i++) + { + var frame = st.GetFrame(i); + if (frame.GetMethod().Module.Name.ToLower() != "sqlsugar.dll"&& frame.GetMethod().Name.First()!='<') + { + info.MyStackTraceList.Add(new StackTraceInfoItem() + { + FileName = frame.GetFileName(), + MethodName = frame.GetMethod().Name, + Line = frame.GetFileLineNumber() + }); + } + else + { + info.SugarStackTraceList.Add(new StackTraceInfoItem() + { + FileName = frame.GetFileName(), + MethodName = frame.GetMethod().Name, + Line = frame.GetFileLineNumber() + }); + } + } + return info; + } + internal static T To(object value) { return (T)To(value, typeof(T)); @@ -59,7 +92,7 @@ namespace SqlSugar itemSql = Regex.Replace(itemSql, string.Format(@"{0}\)", "\\" + itemParameter.ParameterName), newName + ")", RegexOptions.IgnoreCase); itemSql = Regex.Replace(itemSql, string.Format(@"{0}\,", "\\" + itemParameter.ParameterName), newName + ",", RegexOptions.IgnoreCase); itemSql = Regex.Replace(itemSql, string.Format(@"{0}$", "\\" + itemParameter.ParameterName), newName, RegexOptions.IgnoreCase); - itemSql = Regex.Replace(itemSql, string.Format(@"\+{0}\+", "\\" + itemParameter.ParameterName), "+"+newName+"+", RegexOptions.IgnoreCase); + itemSql = Regex.Replace(itemSql, string.Format(@"\+{0}\+", "\\" + itemParameter.ParameterName), "+" + newName + "+", RegexOptions.IgnoreCase); itemSql = Regex.Replace(itemSql, string.Format(@"\|\|{0}\|\|", "\\" + itemParameter.ParameterName), "+" + newName + "+", RegexOptions.IgnoreCase); return itemSql; } @@ -119,7 +152,7 @@ namespace SqlSugar return (T)Convert.ChangeType(obj, typeof(T)); } - internal static void RepairReplicationParameters(ref string appendSql, SugarParameter[] parameters, int addIndex,string append=null) + internal static void RepairReplicationParameters(ref string appendSql, SugarParameter[] parameters, int addIndex, string append = null) { if (appendSql.HasValue() && parameters.HasValue()) { @@ -127,7 +160,7 @@ namespace SqlSugar { //Compatible with.NET CORE parameters case var name = parameter.ParameterName; - string newName = name +append+ addIndex; + string newName = name + append + addIndex; appendSql = ReplaceSqlParameter(appendSql, parameter, newName); parameter.ParameterName = newName; } @@ -160,7 +193,7 @@ namespace SqlSugar return targetType.IsValueType ? Activator.CreateInstance(targetType) : null; } - internal static Int64 GetLong(byte[] bytes) + internal static Int64 GetLong(byte[] bytes) { return Convert.ToInt64(string.Join("", bytes).PadRight(20, '0')); } @@ -235,7 +268,7 @@ namespace SqlSugar } return decode; } - catch + catch { return code; }