Skip to content

Commit dbb8ded

Browse files
committed
Enhancing DbQueryBuilder parameters
1 parent 320b923 commit dbb8ded

File tree

16 files changed

+206
-251
lines changed

16 files changed

+206
-251
lines changed

DataCommander.Providers/ResultWriter/LogResultWriter.cs

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
using Foundation;
1111
using Foundation.Assertions;
1212
using Foundation.Data;
13-
using Foundation.Data.SqlClient.Orm;
13+
using Foundation.DbQueryBuilding;
1414
using Foundation.Diagnostics;
1515
using Foundation.Linq;
1616
using Foundation.Log;
@@ -23,9 +23,9 @@ internal sealed class LogResultWriter : IResultWriter
2323
{
2424
private class Result
2525
{
26-
public readonly ReadOnlyCollection<Field> Fields;
26+
public readonly ReadOnlyCollection<DbQueryResultField> Fields;
2727

28-
public Result(ReadOnlyCollection<Field> fields)
28+
public Result(ReadOnlyCollection<DbQueryResultField> fields)
2929
{
3030
Fields = fields;
3131
}
@@ -58,22 +58,22 @@ public LogResultWriter(Action<InfoMessage> addInfoMessage)
5858
void IResultWriter.BeforeExecuteReader(AsyncDataAdapterCommand asyncDataAdapterCommand)
5959
{
6060
_beforeExecuteReaderTimestamp = Stopwatch.GetTimestamp();
61-
var command = asyncDataAdapterCommand.Command;
62-
var message = $"Executing command[{_commandCount}] from line {asyncDataAdapterCommand.LineIndex + 1}...\r\n{command.CommandText}";
63-
6461
++_commandCount;
6562

66-
var commandText = asyncDataAdapterCommand.Command.CommandText;
63+
var command = asyncDataAdapterCommand.Command;
64+
var commandText = command.CommandText;
6765
if (commandText.StartsWith("/* Query"))
6866
{
6967
var index = command.CommandText.IndexOf("*/");
7068
_commandText = commandText.Substring(index + 4);
7169
var json = commandText.Substring(10, index - 10);
7270
_query = JsonConvert.DeserializeObject<QueryConfiguration.Query>(json);
7371
_results = new List<Result>();
74-
asyncDataAdapterCommand.Command.CommandText = GetParameterizedCommandText(_query.Parameters, _commandText);
72+
command.CommandText = GetParameterizedCommandText(_query.Parameters, _commandText);
7573
}
7674

75+
var message = $"Executing command[{_commandCount}] from line {asyncDataAdapterCommand.LineIndex + 1}...\r\n{command.CommandText}";
76+
7777
var parameters = command.Parameters;
7878
if (!parameters.IsNullOrEmpty())
7979
message += "\r\n" + command.Parameters.ToLogString();
@@ -85,7 +85,7 @@ private static string GetParameterizedCommandText(ReadOnlyCollection<Parameter>
8585
{
8686
var stringBuilder = new StringBuilder();
8787
foreach (var parameter in parameters)
88-
stringBuilder.Append($"declare @{parameter.Name} {parameter.DataType} = {parameter.Value}\r\n");
88+
stringBuilder.Append($"declare @{parameter.Name} {parameter.DataType}{parameter.Value}\r\n");
8989
stringBuilder.Append(commandText);
9090
return stringBuilder.ToString();
9191
}
@@ -108,8 +108,23 @@ void IResultWriter.AfterCloseReader(int affectedRows)
108108
var message = $"Command[{_commandCount - 1}] completed in {StopwatchTimeSpan.ToString(duration, 3)} seconds. {affected}";
109109
_addInfoMessage(new InfoMessage(now, InfoMessageSeverity.Verbose, null, message));
110110

111-
_query = null;
112-
_results = null;
111+
if (_query != null)
112+
{
113+
var parameters = _query.Parameters.Select(ToParameter).ToReadOnlyCollection();
114+
var results = _query.Results.Zip(_results, ToResult).ToReadOnlyCollection();
115+
var query = new DbQuery(_query.Namespace, _query.Name, _commandText, 0, parameters, results);
116+
117+
var queryBuilder = new DbQueryBuilder(query);
118+
var csharpSourceCode = queryBuilder.Build();
119+
Log.Trace($"\r\n{csharpSourceCode}");
120+
121+
var timestamp = LocalTime.Default.Now.ToString("yyyy.MM.dd HHmmss.fff");
122+
var path = Path.Combine(Path.GetTempPath(), $"DataCommander.Orm.{timestamp}.cs");
123+
File.WriteAllText(path, csharpSourceCode, Encoding.UTF8);
124+
125+
_query = null;
126+
_results = null;
127+
}
113128
}
114129

115130
void IResultWriter.WriteTableBegin(DataTable schemaTable)
@@ -156,21 +171,6 @@ void IResultWriter.WriteTableEnd()
156171
var message =
157172
$"Reading {_rowCount} row(s) from command[{_commandCount - 1}] into table[{_tableCount - 1}] finished in {StopwatchTimeSpan.ToString(duration, 3)} seconds.";
158173
_addInfoMessage(new InfoMessage(LocalTime.Default.Now, InfoMessageSeverity.Verbose, null, message));
159-
160-
if (_query != null)
161-
{
162-
var parameters = _query.Parameters.Select(ToParameter).ToReadOnlyCollection();
163-
var results = _query.Results.Zip(_results, ToResult).ToReadOnlyCollection();
164-
var query = new Foundation.Data.SqlClient.Orm.Query(_query.Namespace, _query.Name, _commandText, 0, parameters, results);
165-
166-
var queryBuilder = new QueryBuilder(query);
167-
var csharpSourceCode = queryBuilder.Build();
168-
Log.Trace($"\r\n{csharpSourceCode}");
169-
170-
var timestamp = LocalTime.Default.Now.ToString("yyyy.MM.dd HHmmss.fff");
171-
var path = Path.Combine(Path.GetTempPath(), $"DataCommander.Orm.{timestamp}.cs");
172-
File.WriteAllText(path, csharpSourceCode, Encoding.UTF8);
173-
}
174174
}
175175

176176
void IResultWriter.WriteParameters(IDataParameterCollection parameters)
@@ -184,10 +184,9 @@ void IResultWriter.End()
184184
_addInfoMessage(new InfoMessage(LocalTime.Default.Now, InfoMessageSeverity.Verbose, null, message));
185185
}
186186

187-
private Foundation.Data.SqlClient.Orm.Parameter ToParameter(Parameter source) =>
188-
new Foundation.Data.SqlClient.Orm.Parameter(source.Name, source.DataType, source.IsNullable);
189-
190-
private Foundation.Data.SqlClient.Orm.Result ToResult(string name, Result result) => new Foundation.Data.SqlClient.Orm.Result(name, result.Fields);
187+
private DbQueryParameter ToParameter(Parameter source) =>
188+
new DbQueryParameter(source.Name, source.DataType, source.SqlDbType, source.CSharpDataType, source.IsNullable, source.CSharpValue);
189+
private DbQueryResult ToResult(string name, Result result) => new DbQueryResult(name, result.Fields);
191190

192191
#endregion
193192

@@ -224,7 +223,7 @@ private Foundation.Data.SqlClient.Orm.Parameter ToParameter(Parameter source) =>
224223
// query = new Query(queryName, parameters.AsReadOnly());
225224
//}
226225

227-
private static Field ToField(FoundationDbColumn column) => new Field(column.ColumnName, column.DataType, column.AllowDbNull == true);
226+
private static DbQueryResultField ToField(FoundationDbColumn column) => new DbQueryResultField(column.ColumnName, column.DataType, column.AllowDbNull == true);
228227

229228
#endregion
230229
}

DataCommander.Providers/ResultWriter/QueryConfiguration/Parameter.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
1-
namespace DataCommander.Providers.ResultWriter.QueryConfiguration
1+
using System.Data;
2+
3+
namespace DataCommander.Providers.ResultWriter.QueryConfiguration
24
{
35
public class Parameter
46
{
57
public readonly string Name;
68
public readonly string DataType;
9+
public readonly SqlDbType? SqlDbType;
10+
public readonly string CSharpDataType;
711
public readonly bool IsNullable;
12+
public readonly string CSharpValue;
813
public readonly string Value;
914

10-
public Parameter(string name, string dataType, bool isNullable, string value)
15+
public Parameter(string name, string dataType, SqlDbType? sqlDbType, string cSharpDataType, bool isNullable, string cSharpValue, string value)
1116
{
1217
Name = name;
1318
DataType = dataType;
19+
SqlDbType = sqlDbType;
20+
CSharpDataType = cSharpDataType;
1421
IsNullable = isNullable;
22+
CSharpValue = cSharpValue;
1523
Value = value;
1624
}
1725
}

Foundation.NetStandard-2.0/Data/DbCommandAsyncExecutor.cs

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,8 @@ internal sealed class DbCommandAsyncExecutor : IDbCommandAsyncExecutor
1010
{
1111
private readonly DbConnection _connection;
1212

13-
public DbCommandAsyncExecutor(DbConnection connection)
14-
{
15-
_connection = connection;
16-
}
17-
18-
public void Execute(Action<IDbConnection> execute)
19-
{
20-
execute(_connection);
21-
}
22-
23-
public Task ExecuteAsync(Func<DbConnection, Task> execute, CancellationToken cancellationToken)
24-
{
25-
return execute(_connection);
26-
}
13+
public DbCommandAsyncExecutor(DbConnection connection) => _connection = connection;
14+
public void Execute(Action<IDbConnection> execute) => execute(_connection);
15+
public Task ExecuteAsync(Func<DbConnection, Task> execute, CancellationToken cancellationToken) => execute(_connection);
2716
}
2817
}

Foundation.NetStandard-2.0/Data/DbConnectionExtensions.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ public static DbCommand CreateCommand(this DbConnection connection, CreateComman
1111
return command;
1212
}
1313

14-
public static IDbCommandAsyncExecutor CreateCommandAsyncExecutor(this DbConnection connection)
15-
{
16-
return new DbCommandAsyncExecutor(connection);
17-
}
14+
public static IDbCommandAsyncExecutor CreateCommandAsyncExecutor(this DbConnection connection) => new DbCommandAsyncExecutor(connection);
1815
}
1916
}

Foundation.NetStandard-2.0/Data/ExecuteNonReaderRequest.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,9 @@ public ExecuteNonReaderRequest(CreateCommandRequest createCommandRequest, Cancel
1515
}
1616

1717
public ExecuteNonReaderRequest(string commandText)
18-
: this(new CreateCommandRequest(commandText), CancellationToken.None)
19-
{
20-
}
18+
: this(new CreateCommandRequest(commandText), CancellationToken.None) => ;
2119

2220
public ExecuteNonReaderRequest(string commandText, ReadOnlyCollection<object> parameters)
23-
: this(new CreateCommandRequest(commandText, parameters), CancellationToken.None)
24-
{
25-
}
21+
: this(new CreateCommandRequest(commandText, parameters), CancellationToken.None) => ;
2622
}
2723
}

Foundation.NetStandard-2.0/Data/SqlClient/Orm/Parameter.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.

Foundation.NetStandard-2.0/Data/SqlClient/Orm/Result.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.

Foundation.NetStandard-2.0/Data/SqlClient/SqlParameterCollectionBuilder.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Data;
55
using System.Data.SqlClient;
66
using Foundation.Linq;
7+
using Microsoft.SqlServer.Server;
78

89
namespace Foundation.Data.SqlClient
910
{
@@ -48,6 +49,12 @@ public void AddDate(string parameterName, DateTime value)
4849
Add(parameter);
4950
}
5051

52+
public void AddStructured(string parameterName, string typeName, ReadOnlyCollection<SqlDataRecord> sqlDataRecords)
53+
{
54+
var parameter = SqlParameterFactory.CreateStructured(parameterName, typeName, sqlDataRecords);
55+
Add(parameter);
56+
}
57+
5158
public ReadOnlyCollection<object> ToReadOnlyCollection()
5259
{
5360
return _parameters.Cast<object>().AsReadOnly();

0 commit comments

Comments
 (0)