Skip to content

Commit 72ddc2c

Browse files
StephenCWillsclackner-gpa
authored andcommitted
GSF.Core: Add functionality to select string encoding in database queries
1 parent d9067de commit 72ddc2c

File tree

1 file changed

+65
-13
lines changed

1 file changed

+65
-13
lines changed

Source/Libraries/GSF.Core/Data/AdoDataConnection.cs

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,15 @@ public class AdoDataConnection : IDisposable
168168
{
169169
#region [ Members ]
170170

171+
// Nested Types
172+
private class VarChar(string text) { public string Text { get; } = text; }
173+
private class NVarChar(string text) { public string Text { get; } = text; }
174+
171175
// Fields
172176
private readonly string m_connectionString;
173177
private readonly Type m_connectionType;
174178
private readonly bool m_disposeConnection;
179+
private DbType? m_defaultStringType = DbType.AnsiString;
175180
private bool m_disposed;
176181

177182
#endregion
@@ -405,6 +410,23 @@ private AdoDataConnection(string connectionString, string dataProviderString, bo
405410
/// </summary>
406411
public int DefaultTimeout { get; set; } = DataExtensions.DefaultTimeoutDuration;
407412

413+
/// <summary>
414+
/// Gets or sets a value to indicate whether queries should default to ANSI strings instead of Unicode strings.
415+
/// </summary>
416+
public DbType? DefaultStringType
417+
{
418+
get => m_defaultStringType;
419+
set
420+
{
421+
DbType?[] validTypes = [DbType.AnsiString, DbType.String, null];
422+
423+
if (!validTypes.Contains(value))
424+
throw new ArgumentOutOfRangeException(nameof(value), "DB strings can only be AnsiString or String");
425+
426+
m_defaultStringType = value;
427+
}
428+
}
429+
408430
/// <summary>
409431
/// Gets current UTC date-time in an implementation that is proper for the connected <see cref="AdoDataConnection"/> database type.
410432
/// </summary>
@@ -939,6 +961,26 @@ public object Guid(Guid value)
939961
return value;
940962
}
941963

964+
/// <summary>
965+
/// Instructs <see cref="AdoDataConnection"/> to treat this string as an ANSI string in parameterized queries.
966+
/// </summary>
967+
/// <param name="value">The string to be treated as ANSI.</param>
968+
/// <returns>The value to be used in parameterized queries.</returns>
969+
public object ANSI(string value)
970+
{
971+
return new VarChar(value);
972+
}
973+
974+
/// <summary>
975+
/// Instructs <see cref="AdoDataConnection"/> to treat this string as a Unicode string in parameterized queries.
976+
/// </summary>
977+
/// <param name="value">The string to be treated as Unicode.</param>
978+
/// <returns>The value to be used in parameterized queries.</returns>
979+
public object Unicode(string value)
980+
{
981+
return new NVarChar(value);
982+
}
983+
942984
/// <summary>
943985
/// Retrieves <see cref="System.Guid"/> from a <see cref="DataRow"/> field based on database type.
944986
/// </summary>
@@ -1020,31 +1062,41 @@ private object[] ResolveParameters(object[] parameters)
10201062
{
10211063
for (int i = 0; i < parameters.Length; i++)
10221064
{
1023-
object value = parameters[i];
1024-
DbType? type = null;
1065+
object parameter = parameters[i];
1066+
1067+
DbType? type = parameter switch
1068+
{
1069+
string _ => DefaultStringType,
1070+
VarChar _ => DbType.AnsiString,
1071+
NVarChar _ => DbType.String,
1072+
IDbDataParameter p => p.DbType,
1073+
_ => null
1074+
};
10251075

1026-
if (value is IDbDataParameter dataParameter)
1076+
object value = parameter switch
10271077
{
1028-
type = dataParameter.DbType;
1029-
value = dataParameter.Value;
1030-
}
1078+
VarChar s => s.Text,
1079+
NVarChar s => s.Text,
1080+
IDbDataParameter p => p.Value,
1081+
_ => parameter
1082+
};
10311083

1032-
value = value switch
1084+
parameter = value switch
10331085
{
10341086
null => DBNull.Value,
10351087
bool b => Bool(b),
10361088
Guid guid => Guid(guid),
1037-
_ => value
1089+
_ => parameter
10381090
};
10391091

1040-
IDbDataParameter parameter = command.CreateParameter();
1092+
IDbDataParameter dataParameter = command.CreateParameter();
10411093

10421094
if (type.HasValue)
1043-
parameter.DbType = type.Value;
1095+
dataParameter.DbType = type.Value;
10441096

1045-
parameter.ParameterName = "@p" + i;
1046-
parameter.Value = value;
1047-
dataParameters[i] = parameter;
1097+
dataParameter.ParameterName = "@p" + i;
1098+
dataParameter.Value = parameter;
1099+
dataParameters[i] = dataParameter;
10481100
}
10491101
}
10501102
}

0 commit comments

Comments
 (0)