Repository navigation
Expand file tree
/
Copy pathDbCommandHelper.cs
More file actions
82 lines (67 loc) · 3.37 KB
/
Copy pathDbCommandHelper.cs
File metadata and controls
82 lines (67 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// ----------------------------------------------------------------------------------
// Copyright Microsoft Corporation
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------------------------------------------------------------
namespace DurableTask.SqlServer.Internal
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
/// <summary>
/// Intended for internal use only; not all edge cases are handled, but these extension methods will work correctly for the queries defined in this assembly and results in more readable code.
/// </summary>
internal static class DbCommandHelper
{
internal readonly static IDictionary<string, object> EmptyParameters = new Dictionary<string, object>();
internal static void AddStatement(this DbCommand source, string sql, IDictionary<string, object> parameters = null)
{
if (source == null) throw new ArgumentNullException(nameof(source));
//replace each parameter in the sql statement with auto-generated names
//add parameters using new auto-generated names
foreach (var parameter in parameters ?? EmptyParameters)
{
var newName = Guid.NewGuid().ToString("N");
sql = sql.Replace("@" + parameter.Key, "@" + newName);
source.AddParameter(newName, parameter.Value);
}
//add newline to ensure commands have some white-space between them; added two new lines for readability
if (!string.IsNullOrWhiteSpace(source.CommandText))
source.CommandText += Environment.NewLine + Environment.NewLine;
source.CommandText += sql;
return;
}
internal static void AddStatement(this DbCommand source, string sql, object parameters)
{
if (source == null) throw new ArgumentNullException(nameof(source));
var dictionary = new Dictionary<string, object>();
//convert object to dictionary
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(parameters))
{
dictionary.Add(descriptor.Name, descriptor.GetValue(parameters));
}
source.AddStatement(sql, dictionary);
}
internal static DbCommand AddParameter(this DbCommand source, string name, object value)
{
if (source == null) throw new ArgumentNullException(nameof(source));
var parameter = source.CreateParameter();
parameter.ParameterName = name;
parameter.Value = value ?? DBNull.Value;
if (value is DateTime)
parameter.DbType = DbType.DateTime2;
source.Parameters.Add(parameter);
//allow method-chaining
return source;
}
}
}