22using System . Data ;
33using System . Data . Common ;
44using System . IO ;
5+ using MySql . Data . MySqlClient . Types ;
56
67namespace MySql . Data . MySqlClient
78{
89 public sealed class MySqlParameter : DbParameter
910 {
1011 public MySqlParameter ( )
1112 {
13+ m_mySqlDbType = MySqlDbType . VarChar ;
1214 }
1315
1416 public MySqlParameter ( string name , object objValue )
1517 {
18+ m_mySqlDbType = MySqlDbType . VarChar ;
1619 ParameterName = name ;
1720 Value = objValue ;
1821 }
1922
20- public override DbType DbType { get ; set ; }
23+ public override DbType DbType
24+ {
25+ get => m_dbType ;
26+ set
27+ {
28+ m_dbType = value ;
29+ m_mySqlDbType = TypeMapper . Instance . GetMySqlDbTypeForDbType ( value ) ;
30+ HasSetDbType = true ;
31+ }
32+ }
33+
34+ public MySqlDbType MySqlDbType
35+ {
36+ get => m_mySqlDbType ;
37+ set
38+ {
39+ m_dbType = TypeMapper . Instance . GetDbTypeForMySqlDbType ( value ) ;
40+ m_mySqlDbType = value ;
41+ HasSetDbType = true ;
42+ }
43+ }
2144
2245 public override ParameterDirection Direction
2346 {
@@ -77,22 +100,14 @@ public override void ResetDbType()
77100 DbType = default ( DbType ) ;
78101 }
79102
80- public MySqlDbType MySqlDbType {
81- get {
82- return Types . TypeMapper . ConverToMySqlDbType ( DbType ) ;
83- }
84- set {
85- DbType = Types . TypeMapper . ConvertFromMySqlDbType ( MySqlDbType ) ;
86- }
87- }
88-
89-
90103 internal MySqlParameter WithParameterName ( string parameterName ) => new MySqlParameter ( this , parameterName ) ;
91104
92105 private MySqlParameter ( MySqlParameter other , string parameterName )
93106 {
94- DbType = other . DbType ;
107+ m_dbType = other . m_dbType ;
108+ m_mySqlDbType = other . m_mySqlDbType ;
95109 m_direction = other . m_direction ;
110+ HasSetDbType = other . HasSetDbType ;
96111 IsNullable = other . IsNullable ;
97112 Size = other . Size ;
98113 ParameterName = parameterName ?? other . ParameterName ;
@@ -105,6 +120,8 @@ private MySqlParameter(MySqlParameter other, string parameterName)
105120
106121 internal bool HasSetDirection => m_direction . HasValue ;
107122
123+ internal bool HasSetDbType { get ; set ; }
124+
108125 internal string NormalizedParameterName { get ; private set ; }
109126
110127 internal void AppendSqlString ( BinaryWriter writer , StatementPreparerOptions options )
@@ -190,27 +207,27 @@ internal void AppendSqlString(BinaryWriter writer, StatementPreparerOptions opti
190207 writer . WriteUtf8 ( "'{0:D}'" . FormatInvariant ( guidValue ) ) ;
191208 }
192209 }
193- else if ( DbType == DbType . Int16 )
210+ else if ( MySqlDbType == MySqlDbType . Int16 )
194211 {
195212 writer . WriteUtf8 ( "{0}" . FormatInvariant ( ( short ) Value ) ) ;
196213 }
197- else if ( DbType == DbType . UInt16 )
214+ else if ( MySqlDbType == MySqlDbType . UInt16 )
198215 {
199216 writer . WriteUtf8 ( "{0}" . FormatInvariant ( ( ushort ) Value ) ) ;
200217 }
201- else if ( DbType == DbType . Int32 )
218+ else if ( MySqlDbType == MySqlDbType . Int32 )
202219 {
203220 writer . WriteUtf8 ( "{0}" . FormatInvariant ( ( int ) Value ) ) ;
204221 }
205- else if ( DbType == DbType . UInt32 )
222+ else if ( MySqlDbType == MySqlDbType . UInt32 )
206223 {
207224 writer . WriteUtf8 ( "{0}" . FormatInvariant ( ( uint ) Value ) ) ;
208225 }
209- else if ( DbType == DbType . Int64 )
226+ else if ( MySqlDbType == MySqlDbType . Int64 )
210227 {
211228 writer . WriteUtf8 ( "{0}" . FormatInvariant ( ( long ) Value ) ) ;
212229 }
213- else if ( DbType == DbType . UInt64 )
230+ else if ( MySqlDbType == MySqlDbType . UInt64 )
214231 {
215232 writer . WriteUtf8 ( "{0}" . FormatInvariant ( ( ulong ) Value ) ) ;
216233 }
@@ -238,6 +255,8 @@ internal static string NormalizeParameterName(string name)
238255 return name . StartsWith ( "@" , StringComparison . Ordinal ) || name . StartsWith ( "?" , StringComparison . Ordinal ) ? name . Substring ( 1 ) : name ;
239256 }
240257
258+ DbType m_dbType ;
259+ MySqlDbType m_mySqlDbType ;
241260 string m_name ;
242261 ParameterDirection ? m_direction ;
243262 }
0 commit comments