Skip to content

Commit 1e06c0a

Browse files
committed
Implement MySqlParameter constructors. Fixes #402
1 parent ce91731 commit 1e06c0a

File tree

3 files changed

+207
-23
lines changed

3 files changed

+207
-23
lines changed

src/MySqlConnector/MySql.Data.MySqlClient/MySqlParameter.cs

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@ public sealed class MySqlParameter : DbParameter
1111
{
1212
public MySqlParameter()
1313
{
14-
m_mySqlDbType = MySqlDbType.VarChar;
15-
SourceColumn = "";
1614
#if !NETSTANDARD1_3
1715
SourceVersion = DataRowVersion.Current;
1816
#endif
17+
ResetDbType();
1918
}
2019

2120
public MySqlParameter(string name, object objValue)
@@ -25,6 +24,27 @@ public MySqlParameter(string name, object objValue)
2524
Value = objValue;
2625
}
2726

27+
public MySqlParameter(string name, MySqlDbType mySqlDbType)
28+
: this(name, mySqlDbType, 0)
29+
{
30+
}
31+
32+
public MySqlParameter(string name, MySqlDbType mySqlDbType, int size)
33+
: this(name, mySqlDbType, size, null)
34+
{
35+
}
36+
37+
public MySqlParameter(string name, MySqlDbType mySqlDbType, int size, string sourceColumn)
38+
{
39+
ParameterName = name;
40+
MySqlDbType = mySqlDbType;
41+
Size = size;
42+
SourceColumn = sourceColumn;
43+
#if !NETSTANDARD1_3
44+
SourceVersion = DataRowVersion.Current;
45+
#endif
46+
}
47+
2848
public override DbType DbType
2949
{
3050
get => m_dbType;
@@ -65,14 +85,11 @@ public override ParameterDirection Direction
6585

6686
public override string ParameterName
6787
{
68-
get
69-
{
70-
return m_name;
71-
}
88+
get => m_name;
7289
set
7390
{
7491
m_name = value;
75-
NormalizedParameterName = NormalizeParameterName(m_name);
92+
NormalizedParameterName = value == null ? null : NormalizeParameterName(m_name);
7693
}
7794
}
7895

@@ -86,11 +103,29 @@ public override string ParameterName
86103
public override DataRowVersion SourceVersion { get; set; }
87104
#endif
88105

89-
public override object Value { get; set; }
106+
public override object Value
107+
{
108+
get => m_value;
109+
set
110+
{
111+
m_value = value;
112+
if (!HasSetDbType && value != null)
113+
{
114+
var typeMapping = TypeMapper.Instance.GetDbTypeMapping(value.GetType());
115+
if (typeMapping != null)
116+
{
117+
m_dbType = typeMapping.DbTypes[0];
118+
m_mySqlDbType = TypeMapper.Instance.GetMySqlDbTypeForDbType(m_dbType);
119+
}
120+
}
121+
}
122+
}
90123

91124
public override void ResetDbType()
92125
{
93-
DbType = default(DbType);
126+
m_mySqlDbType = MySqlDbType.VarChar;
127+
m_dbType = DbType.String;
128+
HasSetDbType = false;
94129
}
95130

96131
internal MySqlParameter WithParameterName(string parameterName) => new MySqlParameter(this, parameterName);
@@ -252,5 +287,6 @@ internal static string NormalizeParameterName(string name)
252287
MySqlDbType m_mySqlDbType;
253288
string m_name;
254289
ParameterDirection? m_direction;
290+
object m_value;
255291
}
256292
}

tests/SideBySide/ParameterTests.cs

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,169 @@ public void DbTypesToMySqlDbTypes(DbType[] dbTypes, MySqlDbType[] mySqlDbTypes)
5757
Assert.Equal(mySqlDbType, parameter.MySqlDbType);
5858
Assert.Equal(dbTypes[0], parameter.DbType);
5959
}
60+
}
61+
62+
[Fact]
63+
public void ConstructorSimple()
64+
{
65+
var parameter = new MySqlParameter();
66+
Assert.Null(parameter.ParameterName);
67+
#if BASELINE
68+
Assert.Equal(MySqlDbType.Decimal, parameter.MySqlDbType);
69+
Assert.Equal(DbType.AnsiString, parameter.DbType);
70+
#else
71+
Assert.Equal(MySqlDbType.VarChar, parameter.MySqlDbType);
72+
Assert.Equal(DbType.String, parameter.DbType);
73+
#endif
74+
Assert.False(parameter.IsNullable);
75+
Assert.Null(parameter.Value);
76+
Assert.Equal(ParameterDirection.Input, parameter.Direction);
77+
Assert.Equal(0, parameter.Precision);
78+
Assert.Equal(0, parameter.Scale);
79+
Assert.Equal(0, parameter.Size);
80+
#if !NETCOREAPP1_1_2
81+
Assert.Equal(DataRowVersion.Current, parameter.SourceVersion);
82+
#endif
83+
Assert.Null(parameter.SourceColumn);
84+
}
85+
86+
[Fact]
87+
public void ConstructorNameValue()
88+
{
89+
var parameter = new MySqlParameter("@name", 1.0);
90+
Assert.Equal("@name", parameter.ParameterName);
91+
Assert.Equal(MySqlDbType.Double, parameter.MySqlDbType);
92+
Assert.Equal(DbType.Double, parameter.DbType);
93+
Assert.False(parameter.IsNullable);
94+
Assert.Equal(1.0, parameter.Value);
95+
Assert.Equal(ParameterDirection.Input, parameter.Direction);
96+
Assert.Equal(0, parameter.Precision);
97+
Assert.Equal(0, parameter.Scale);
98+
Assert.Equal(0, parameter.Size);
99+
#if !NETCOREAPP1_1_2
100+
Assert.Equal(DataRowVersion.Current, parameter.SourceVersion);
101+
#endif
102+
Assert.Null(parameter.SourceColumn);
103+
}
104+
105+
[Fact]
106+
public void ConstructorNameType()
107+
{
108+
var parameter = new MySqlParameter("@name", MySqlDbType.Double);
109+
Assert.Equal("@name", parameter.ParameterName);
110+
Assert.Equal(MySqlDbType.Double, parameter.MySqlDbType);
111+
Assert.Equal(DbType.Double, parameter.DbType);
112+
Assert.False(parameter.IsNullable);
113+
Assert.Null(parameter.Value);
114+
Assert.Equal(ParameterDirection.Input, parameter.Direction);
115+
Assert.Equal(0, parameter.Precision);
116+
Assert.Equal(0, parameter.Scale);
117+
Assert.Equal(0, parameter.Size);
118+
#if !NETCOREAPP1_1_2
119+
Assert.Equal(DataRowVersion.Current, parameter.SourceVersion);
120+
#endif
121+
Assert.Null(parameter.SourceColumn);
122+
}
123+
124+
[Fact]
125+
public void ConstructorNameTypeSize()
126+
{
127+
var parameter = new MySqlParameter("@name", MySqlDbType.Double, 4);
128+
Assert.Equal("@name", parameter.ParameterName);
129+
Assert.Equal(MySqlDbType.Double, parameter.MySqlDbType);
130+
Assert.Equal(DbType.Double, parameter.DbType);
131+
Assert.False(parameter.IsNullable);
132+
Assert.Null(parameter.Value);
133+
Assert.Equal(ParameterDirection.Input, parameter.Direction);
134+
Assert.Equal(0, parameter.Precision);
135+
Assert.Equal(0, parameter.Scale);
136+
Assert.Equal(4, parameter.Size);
137+
#if !NETCOREAPP1_1_2
138+
Assert.Equal(DataRowVersion.Current, parameter.SourceVersion);
139+
#endif
140+
Assert.Null(parameter.SourceColumn);
141+
}
142+
143+
[Fact]
144+
public void ConstructorNameTypeSizeSourceColumn()
145+
{
146+
var parameter = new MySqlParameter("@name", MySqlDbType.Int32, 4, "source");
147+
Assert.Equal("@name", parameter.ParameterName);
148+
Assert.Equal(MySqlDbType.Int32, parameter.MySqlDbType);
149+
Assert.Equal(DbType.Int32, parameter.DbType);
150+
Assert.False(parameter.IsNullable);
151+
Assert.Null(parameter.Value);
152+
Assert.Equal(ParameterDirection.Input, parameter.Direction);
153+
Assert.Equal(0, parameter.Precision);
154+
Assert.Equal(0, parameter.Scale);
155+
Assert.Equal(4, parameter.Size);
156+
#if !NETCOREAPP1_1_2
157+
Assert.Equal(DataRowVersion.Current, parameter.SourceVersion);
158+
#endif
159+
Assert.Equal("source", parameter.SourceColumn);
160+
}
161+
162+
[Theory]
163+
[InlineData(1, DbType.Int32, MySqlDbType.Int32)]
164+
[InlineData(1.0, DbType.Double, MySqlDbType.Double)]
165+
[InlineData(1.0f, DbType.Single, MySqlDbType.Float)]
166+
[InlineData("1", DbType.String, MySqlDbType.VarChar)]
167+
#if BASELINE
168+
[InlineData('1', DbType.Object, MySqlDbType.Blob)]
169+
#else
170+
[InlineData('1', DbType.String, MySqlDbType.VarChar)]
171+
#endif
172+
public void SetValueInfersType(object value, DbType expectedDbType, MySqlDbType expectedMySqlDbType)
173+
{
174+
var parameter = new MySqlParameter { Value = value };
175+
Assert.Equal(expectedDbType, parameter.DbType);
176+
Assert.Equal(expectedMySqlDbType, parameter.MySqlDbType);
177+
}
178+
179+
[Fact]
180+
public void SetValueToByteArrayInfersType()
181+
{
182+
var parameter = new MySqlParameter { Value = new byte[1] };
183+
#if BASELINE
184+
Assert.Equal(DbType.Object, parameter.DbType);
185+
#else
186+
Assert.Equal(DbType.Binary, parameter.DbType);
187+
#endif
188+
Assert.Equal(MySqlDbType.Blob, parameter.MySqlDbType);
189+
}
190+
191+
192+
[Fact]
193+
public void SetValueDoesNotInferType()
194+
{
195+
var parameter = new MySqlParameter("@name", MySqlDbType.Int32);
196+
Assert.Equal(DbType.Int32, parameter.DbType);
197+
Assert.Equal(MySqlDbType.Int32, parameter.MySqlDbType);
198+
199+
parameter.Value = 1.0;
200+
Assert.Equal(DbType.Int32, parameter.DbType);
201+
Assert.Equal(MySqlDbType.Int32, parameter.MySqlDbType);
202+
}
203+
204+
[Fact]
205+
public void ResetDbType()
206+
{
207+
var parameter = new MySqlParameter("@name", 1);
208+
Assert.Equal(DbType.Int32, parameter.DbType);
209+
Assert.Equal(MySqlDbType.Int32, parameter.MySqlDbType);
210+
211+
parameter.ResetDbType();
212+
#if BASELINE
213+
Assert.Equal(MySqlDbType.Int32, parameter.MySqlDbType);
214+
Assert.Equal(DbType.Int32, parameter.DbType);
215+
#else
216+
Assert.Equal(MySqlDbType.VarChar, parameter.MySqlDbType);
217+
Assert.Equal(DbType.String, parameter.DbType);
218+
#endif
60219

220+
parameter.Value = 1.0;
221+
Assert.Equal(DbType.Double, parameter.DbType);
222+
Assert.Equal(MySqlDbType.Double, parameter.MySqlDbType);
61223
}
62224
}
63225
}

tests/SideBySide/QueryTests.cs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -728,20 +728,6 @@ private void UseReaderWithoutDisposingThread(object obj)
728728
}
729729
}
730730

731-
[Fact]
732-
public void ParameterDefaults()
733-
{
734-
var parameter = new MySqlParameter();
735-
Assert.Equal(DbType.AnsiString, parameter.DbType);
736-
Assert.Equal(ParameterDirection.Input, parameter.Direction);
737-
Assert.False(parameter.IsNullable);
738-
Assert.Null(parameter.ParameterName);
739-
Assert.Equal(0, parameter.Precision);
740-
Assert.Equal(0, parameter.Scale);
741-
Assert.Equal(0, parameter.Size);
742-
Assert.Null(parameter.Value);
743-
}
744-
745731
[Fact]
746732
public void InputOutputParameter()
747733
{

0 commit comments

Comments
 (0)