Skip to content

Commit 49a4be8

Browse files
Naragatobgrainger
authored andcommitted
Serialize enums as string when type is MySqlDbType.String. Fixes #459
1 parent 317dbb0 commit 49a4be8

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,10 @@ internal void AppendSqlString(BinaryWriter writer, StatementPreparerOptions opti
303303
{
304304
writer.WriteUtf8("{0}".FormatInvariant((ulong) Value));
305305
}
306+
else if ((MySqlDbType == MySqlDbType.String || MySqlDbType == MySqlDbType.VarChar) && HasSetDbType && Value is Enum)
307+
{
308+
writer.WriteUtf8("'{0:G}'".FormatInvariant(Value));
309+
}
306310
else if (Value is Enum)
307311
{
308312
writer.WriteUtf8("{0:d}".FormatInvariant(Value));
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace MySqlConnector.Tests
2+
{
3+
internal enum DummyEnum
4+
{
5+
FirstValue,
6+
SecondValue
7+
}
8+
}

tests/MySqlConnector.Tests/StatementPreparerTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,28 @@ public void ParametersIgnoredInComments(string sql)
3030
Assert.Equal(sql, GetParsedSql(sql));
3131
}
3232

33+
[Theory]
34+
[InlineData(MySqlDbType.String, DummyEnum.FirstValue, "'FirstValue'")]
35+
[InlineData(MySqlDbType.VarChar, DummyEnum.FirstValue, "'FirstValue'")]
36+
[InlineData(null, DummyEnum.FirstValue, "0")]
37+
public void EnumParametersAreParsedCorrectly(MySqlDbType? type, object value, string replacedValue)
38+
{
39+
const string sql = "SELECT @param";
40+
var parameters = new MySqlParameterCollection();
41+
var paramater = new MySqlParameter("@param", value);
42+
43+
if (type != null)
44+
{
45+
paramater.MySqlDbType = type.Value;
46+
}
47+
48+
parameters.Add(paramater);
49+
50+
var parsedSql = GetParsedSql(sql, parameters);
51+
Assert.Equal(sql.Replace("@param", replacedValue), parsedSql);
52+
53+
}
54+
3355
[Theory]
3456
[InlineData("SELECT '@param';")]
3557
[InlineData("SELECT \"@param\";")]

tests/SideBySide/InsertTests.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,37 @@ public void InsertEnumValue()
249249
Assert.Equal(Enum64.On, results[1].Enum64);
250250
}
251251

252+
[Fact]
253+
public async Task EnumParametersAreParsedCorrectly()
254+
{
255+
await m_database.Connection.ExecuteAsync(@"drop table if exists insert_enum_value2;
256+
create table insert_enum_value2(rowid integer not null primary key auto_increment, `Varchar` varchar(10), `String` varchar(10), `Int` int null);");
257+
258+
try
259+
{
260+
await m_database.Connection.OpenAsync();
261+
using (var command = new MySqlCommand("INSERT INTO insert_enum_value2 (`Varchar`, `String`, `Int`) VALUES (@Varchar, @String, @Int);", m_database.Connection))
262+
{
263+
264+
command.Parameters.Add(new MySqlParameter("@String", MySqlColor.Orange)).MySqlDbType = MySqlDbType.String;
265+
command.Parameters.Add(new MySqlParameter("@Varchar", MySqlColor.Green)).MySqlDbType = MySqlDbType.VarChar;
266+
command.Parameters.Add(new MySqlParameter("@Int", MySqlColor.None));
267+
268+
await command.ExecuteNonQueryAsync();
269+
var result = (await m_database.Connection.QueryAsync<ColorEnumValues>(@"select `Varchar`, `String`, `Int` from insert_enum_value2;")).ToArray();
270+
Assert.Single(result);
271+
Assert.Equal(MySqlColor.Orange.ToString("G"), result[0].String);
272+
Assert.Equal(MySqlColor.Green.ToString("G"), result[0].Varchar);
273+
Assert.Equal((int) MySqlColor.None, result[0].Int);
274+
}
275+
}
276+
finally
277+
{
278+
m_database.Connection.Close();
279+
}
280+
281+
}
282+
252283
enum Enum16 : short
253284
{
254285
Off,
@@ -272,6 +303,12 @@ class DateTimeOffsetValues
272303
public DateTimeOffset? datetimeoffset1 { get; set; }
273304
}
274305

306+
class ColorEnumValues
307+
{
308+
public string Varchar { get; set; }
309+
public string String { get; set; }
310+
public int Int { get; set; }
311+
}
275312

276313
class EnumValues
277314
{

0 commit comments

Comments
 (0)