@@ -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