From: rburnett Date: July 22 2008 1:29pm Subject: Connector/NET commit: r1347 - in branches/5.0: . Driver/Source/Types TestSuite/Source List-Archive: http://lists.mysql.com/commits/50193 X-Bug: 33322 Message-Id: <200807221329.m6MDT1n3021934@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/5.0/CHANGES branches/5.0/Driver/Source/Types/MySqlDouble.cs branches/5.0/Driver/Source/Types/MySqlSingle.cs branches/5.0/TestSuite/Source/DataTypeTests.cs Log: Fixed writing of single and double values to write out the proper number of digits (bug #33322) Modified: branches/5.0/CHANGES =================================================================== --- branches/5.0/CHANGES 2008-07-21 21:48:23 UTC (rev 1346) +++ branches/5.0/CHANGES 2008-07-22 13:29:01 UTC (rev 1347) @@ -11,6 +11,8 @@ close the connection. (bug #37991) - Fixed problem with byte and unsigned byte values writing more too many bytes when using prepared statements (bug #37968) + - Fixed writing of single and double values to write out the proper number of digits + (bug #33322) Version 5.0.9 - 4/14/08 Modified: branches/5.0/Driver/Source/Types/MySqlDouble.cs =================================================================== --- branches/5.0/Driver/Source/Types/MySqlDouble.cs 2008-07-21 21:48:23 UTC (rev 1346) +++ branches/5.0/Driver/Source/Types/MySqlDouble.cs 2008-07-22 13:29:01 UTC (rev 1347) @@ -83,11 +83,10 @@ void IMySqlValue.WriteValue(MySqlStream stream, bool binary, object val, int length) { double v = Convert.ToDouble(val); - if (binary) - stream.Write(BitConverter.GetBytes(v)); - else - stream.WriteStringNoNull(v.ToString( - CultureInfo.InvariantCulture)); + if (binary) + stream.Write(BitConverter.GetBytes(v)); + else + stream.WriteStringNoNull(v.ToString("R", CultureInfo.InvariantCulture)); } IMySqlValue IMySqlValue.ReadValue(MySqlStream stream, long length, @@ -102,7 +101,7 @@ stream.Read(b, 0, 8); return new MySqlDouble(BitConverter.ToDouble(b, 0)); } - return new MySqlDouble(Double.Parse(stream.ReadString(length), + return new MySqlDouble(Double.Parse(stream.ReadString(length), CultureInfo.InvariantCulture)); } Modified: branches/5.0/Driver/Source/Types/MySqlSingle.cs =================================================================== --- branches/5.0/Driver/Source/Types/MySqlSingle.cs 2008-07-21 21:48:23 UTC (rev 1346) +++ branches/5.0/Driver/Source/Types/MySqlSingle.cs 2008-07-22 13:29:01 UTC (rev 1347) @@ -85,7 +85,7 @@ if (binary) stream.Write(BitConverter.GetBytes(v)); else - stream.WriteStringNoNull(v.ToString( + stream.WriteStringNoNull(v.ToString("R", CultureInfo.InvariantCulture)); } Modified: branches/5.0/TestSuite/Source/DataTypeTests.cs =================================================================== --- branches/5.0/TestSuite/Source/DataTypeTests.cs 2008-07-21 21:48:23 UTC (rev 1346) +++ branches/5.0/TestSuite/Source/DataTypeTests.cs 2008-07-22 13:29:01 UTC (rev 1347) @@ -759,5 +759,28 @@ Assert.AreEqual(0, reader.GetValue(0)); } } + + /// + /// Bug #33322 Incorrect Double/Single value saved to MySQL database using MySQL Connector for + /// + [Test] + public void StoringAndRetrievingDouble() + { + execSQL("DROP TABLE IF EXISTS Test"); + execSQL("CREATE TABLE Test (v DOUBLE(25,20) NOT NULL)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", conn); + cmd.Parameters.Add("?v", MySqlDbType.Double); + cmd.Parameters[0].Value = Math.PI; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + double d = reader.GetDouble(0); + Assert.AreEqual(Math.PI, d); + } + } } }