Skip to content

Commit 6b3b963

Browse files
committed
refactor FormatSql
1 parent 5967407 commit 6b3b963

File tree

3 files changed

+104
-33
lines changed

3 files changed

+104
-33
lines changed

build/version.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<VersionMajor>4</VersionMajor>
44
<VersionMinor>0</VersionMinor>
5-
<VersionPatch>75</VersionPatch>
5+
<VersionPatch>76</VersionPatch>
66
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
77
</PropertyGroup>
88
</Project>

src/SmartSql/Middlewares/PrepareStatementMiddleware.cs

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,55 +18,30 @@ public class PrepareStatementMiddleware : AbstractMiddleware
1818
private readonly SqlParamAnalyzer _sqlParamAnalyzer;
1919
private readonly DbProviderFactory _dbProviderFactory;
2020
private readonly TypeHandlerFactory _typeHandlerFactory;
21+
2122
public PrepareStatementMiddleware(SmartSqlConfig smartSqlConfig)
2223
{
2324
_logger = smartSqlConfig.LoggerFactory.CreateLogger<PrepareStatementMiddleware>();
2425
_sqlParamAnalyzer = smartSqlConfig.SqlParamAnalyzer;
2526
_dbProviderFactory = smartSqlConfig.Database.DbProvider.Factory;
2627
_typeHandlerFactory = smartSqlConfig.TypeHandlerFactory;
2728
}
29+
2830
public override void Invoke<TResult>(ExecutionContext executionContext)
2931
{
3032
InitParameters(executionContext);
3133
InvokeNext<TResult>(executionContext);
3234
}
35+
3336
#region Init Parameter
37+
3438
private void InitParameters(ExecutionContext executionContext)
3539
{
3640
BuildSql(executionContext.Request);
3741
BuildDbParameters(executionContext.Request);
3842
if (_logger.IsEnabled(LogLevel.Debug))
3943
{
40-
var sourceParameters = executionContext.Request.Parameters.DbParameters.Values;
41-
var cmdText = executionContext.Request.RealSql;
42-
string dbParameterStr = string.Join(",", sourceParameters.Select(p => $"{p.ParameterName}={p.Value}"));
43-
string realSql = _sqlParamAnalyzer.Replace(cmdText, (paramName, nameWithPrefix) =>
44-
{
45-
var paramNameCompare = executionContext.SmartSqlConfig.Settings.IgnoreParameterCase ? StringComparison.CurrentCultureIgnoreCase : StringComparison.CurrentCulture;
46-
var dbParam = sourceParameters.FirstOrDefault(m => String.Equals(m.ParameterName, paramName, paramNameCompare));
47-
if (dbParam == null) { return nameWithPrefix; }
48-
if (dbParam.Value == DBNull.Value) { return "NULL"; }
49-
switch (dbParam.DbType)
50-
{
51-
case DbType.AnsiString:
52-
case DbType.AnsiStringFixedLength:
53-
case DbType.DateTime:
54-
case DbType.DateTime2:
55-
case DbType.DateTimeOffset:
56-
case DbType.Guid:
57-
case DbType.String:
58-
case DbType.StringFixedLength:
59-
case DbType.Time:
60-
case DbType.Xml:
61-
{ return $"'{dbParam.Value}'"; }
62-
case DbType.Boolean:
63-
{
64-
return ((bool)dbParam.Value) ? "1" : "0";
65-
}
66-
}
67-
return dbParam.Value.ToString();
68-
});
69-
_logger.LogDebug($"Statement.Id:[{executionContext.Request.FullSqlId}],Sql:{Environment.NewLine}{cmdText}{Environment.NewLine}Parameters:[{dbParameterStr}]{Environment.NewLine}Sql with parameter value: {Environment.NewLine}{realSql}");
44+
_logger.LogDebug(executionContext.FormatSql(true));
7045
}
7146
}
7247

@@ -96,16 +71,19 @@ private void BuildDbParameters(AbstractRequestContext reqConetxt)
9671
propertyName = parameter.Property;
9772
typeHandler = parameter.Handler;
9873
}
74+
9975
if (!reqConetxt.Parameters.TryGetValue(propertyName, out var sqlParameter))
10076
{
10177
continue;
10278
}
79+
10380
var sourceParam = _dbProviderFactory.CreateParameter();
10481
sourceParam.ParameterName = paramName;
10582

10683
if (typeHandler == null)
10784
{
108-
typeHandler = sqlParameter.TypeHandler ?? _typeHandlerFactory.GetTypeHandler(sqlParameter.ParameterType);
85+
typeHandler = sqlParameter.TypeHandler ??
86+
_typeHandlerFactory.GetTypeHandler(sqlParameter.ParameterType);
10987
}
11088

11189
typeHandler.SetParameter(sourceParam, sqlParameter.Value);
@@ -121,18 +99,22 @@ private void InitSourceDbParameter(DbParameter sourceParam, SqlParameter sqlPara
12199
{
122100
sourceParam.DbType = sqlParameter.DbType.Value;
123101
}
102+
124103
if (sqlParameter.Direction.HasValue)
125104
{
126105
sourceParam.Direction = sqlParameter.Direction.Value;
127106
}
107+
128108
if (sqlParameter.Precision.HasValue)
129109
{
130110
sourceParam.Precision = sqlParameter.Precision.Value;
131111
}
112+
132113
if (sqlParameter.Scale.HasValue)
133114
{
134115
sourceParam.Scale = sqlParameter.Scale.Value;
135116
}
117+
136118
if (sqlParameter.Size.HasValue)
137119
{
138120
sourceParam.Size = sqlParameter.Size.Value;
@@ -145,15 +127,18 @@ private void BuildSql(AbstractRequestContext requestContext)
145127
{
146128
return;
147129
}
130+
148131
requestContext.SqlBuilder = new StringBuilder();
149132
requestContext.Statement.BuildSql(requestContext);
150133
requestContext.RealSql = requestContext.SqlBuilder.ToString().Trim();
151134
}
135+
152136
#endregion
137+
153138
public override async Task InvokeAsync<TResult>(ExecutionContext executionContext)
154139
{
155140
InitParameters(executionContext);
156141
await InvokeNextAsync<TResult>(executionContext);
157142
}
158143
}
159-
}
144+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data;
4+
using System.Data.Common;
5+
using System.Linq;
6+
using System.Text;
7+
8+
namespace SmartSql.Utils
9+
{
10+
public static class ExecutionContextExtensions
11+
{
12+
public static string FormatSql(this ExecutionContext executionContext, bool withParameterValue)
13+
{
14+
StringBuilder stringBuilder = new StringBuilder();
15+
var sourceParameters = executionContext.Request.Parameters.DbParameters.Values;
16+
string dbParameterStr = string.Join(",", sourceParameters.Select(p => $"{p.ParameterName}={p.Value}"));
17+
stringBuilder.AppendFormat("Statement.Id:[{0}],", executionContext.Request.FullSqlId);
18+
stringBuilder.Append("Sql:");
19+
stringBuilder.AppendLine();
20+
stringBuilder.Append(executionContext.Request.RealSql);
21+
stringBuilder.AppendLine();
22+
stringBuilder.AppendFormat("Parameters:[{0}]", dbParameterStr);
23+
24+
if (!withParameterValue)
25+
{
26+
return stringBuilder.ToString();
27+
}
28+
29+
stringBuilder.AppendLine();
30+
stringBuilder.Append("Sql with parameter value: ");
31+
stringBuilder.AppendLine();
32+
string realSql = FormatSqlWithParameters(executionContext);
33+
stringBuilder.Append(realSql);
34+
35+
return stringBuilder.ToString();
36+
}
37+
38+
private static string FormatSqlWithParameters(this ExecutionContext executionContext)
39+
{
40+
var sourceParameters = executionContext.Request.Parameters.DbParameters.Values;
41+
return executionContext.SmartSqlConfig.SqlParamAnalyzer.Replace(executionContext.Request.RealSql,
42+
(paramName, nameWithPrefix) =>
43+
{
44+
var paramNameCompare = executionContext.SmartSqlConfig.Settings.IgnoreParameterCase
45+
? StringComparison.CurrentCultureIgnoreCase
46+
: StringComparison.CurrentCulture;
47+
var dbParam =
48+
sourceParameters.FirstOrDefault(
49+
m => String.Equals(m.ParameterName, paramName, paramNameCompare));
50+
if (dbParam == null)
51+
{
52+
return nameWithPrefix;
53+
}
54+
55+
if (dbParam.Value == DBNull.Value)
56+
{
57+
return "NULL";
58+
}
59+
60+
switch (dbParam.DbType)
61+
{
62+
case DbType.AnsiString:
63+
case DbType.AnsiStringFixedLength:
64+
case DbType.DateTime:
65+
case DbType.DateTime2:
66+
case DbType.DateTimeOffset:
67+
case DbType.Guid:
68+
case DbType.String:
69+
case DbType.StringFixedLength:
70+
case DbType.Time:
71+
case DbType.Xml:
72+
{
73+
return $"'{dbParam.Value}'";
74+
}
75+
76+
case DbType.Boolean:
77+
{
78+
return ((bool) dbParam.Value) ? "1" : "0";
79+
}
80+
}
81+
82+
return dbParam.Value.ToString();
83+
});
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)