From: Date: September 27 2006 1:05am Subject: Connector/NET commit: r366 - in branches/1.0: . TestSuite mysqlclient mysqlclient/Types List-Archive: http://lists.mysql.com/commits/12580 X-Bug: 9619 Message-Id: <200609262305.k8QN5o4e013641@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/1.0/CHANGES branches/1.0/TestSuite/DateTimeTests.cs branches/1.0/mysqlclient/Types/MySqlDateTime.cs branches/1.0/mysqlclient/datareader.cs Log: Bug #9619 Cannot update row using DbDataAdapter when row contains an invalid date Modified: branches/1.0/CHANGES =================================================================== --- branches/1.0/CHANGES 2006-09-26 22:59:31 UTC (rev 365) +++ branches/1.0/CHANGES 2006-09-26 23:05:49 UTC (rev 366) @@ -33,6 +33,7 @@ Bug #14592 Wrong column length returned for VARCHAR UTF8 columns Bug #18391 Better error handling for the .NET class "MySqlCommand" needed. Bug #8131 Data Adapter doesn't close connection + Bug #9619 Cannot update row using DbDataAdapter when row contains an invalid date x-xx-05 - Version 1.0.7 Modified: branches/1.0/TestSuite/DateTimeTests.cs =================================================================== --- branches/1.0/TestSuite/DateTimeTests.cs 2006-09-26 22:59:31 UTC (rev 365) +++ branches/1.0/TestSuite/DateTimeTests.cs 2006-09-26 23:05:49 UTC (rev 366) @@ -149,47 +149,57 @@ } } - [Test] - public void TestAllowZeroDateTime() - { - execSQL("INSERT INTO Test (id, d, dt) VALUES (1, '0000-00-00', '0000-00-00 00:00:00')"); + /// + /// Bug #9619 Cannot update row using DbDataAdapter when row contains an invalid date + /// + [Test] + public void TestAllowZeroDateTime() + { + execSQL("INSERT INTO Test (id, d, dt) VALUES (1, '0000-00-00', '0000-00-00 00:00:00')"); - MySqlConnection c = new MySqlConnection( - conn.ConnectionString + ";pooling=false;AllowZeroDatetime=true" ); - c.Open(); - MySqlDataReader reader = null; - try - { - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); - reader = cmd.ExecuteReader(); - reader.Read(); + MySqlConnection c = new MySqlConnection( + conn.ConnectionString + ";pooling=false;AllowZeroDatetime=true"); + c.Open(); + MySqlDataReader reader = null; + try + { + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); + reader = cmd.ExecuteReader(); + reader.Read(); - Assert.IsTrue( reader.GetValue(1) is MySqlDateTime ); - Assert.IsTrue( reader.GetValue(2) is MySqlDateTime ); + Assert.IsTrue(reader.GetValue(1) is MySqlDateTime); + Assert.IsTrue(reader.GetValue(2) is MySqlDateTime); - Assert.IsFalse( reader.GetMySqlDateTime(1).IsValidDateTime ); - Assert.IsFalse( reader.GetMySqlDateTime(2).IsValidDateTime ); + Assert.IsFalse(reader.GetMySqlDateTime(1).IsValidDateTime); + Assert.IsFalse(reader.GetMySqlDateTime(2).IsValidDateTime); - try - { - reader.GetDateTime(1); - Assert.Fail("This should not succeed"); - } - catch (MySqlConversionException) {} + try + { + reader.GetDateTime(1); + Assert.Fail("This should not succeed"); + } + catch (MySqlConversionException) { } + reader.Close(); + reader = null; + DataTable dt = new DataTable(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM test", c); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + da.Fill(dt); + dt.Rows[0]["id"] = 2; + da.Update(dt); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + finally + { + if (reader != null) reader.Close(); + c.Close(); + } + } - } - catch (MySqlException ex) - { - Assert.Fail( ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - c.Close(); - } - } - [Test] public void InsertDateTimeValue() { Modified: branches/1.0/mysqlclient/Types/MySqlDateTime.cs =================================================================== --- branches/1.0/mysqlclient/Types/MySqlDateTime.cs 2006-09-26 22:59:31 UTC (rev 365) +++ branches/1.0/mysqlclient/Types/MySqlDateTime.cs 2006-09-26 23:05:49 UTC (rev 366) @@ -30,7 +30,7 @@ /// public class MySqlDateTime : MySqlValue, IConvertible, IComparable { - private int year, month, day, hour, minute, second; + private int year, month, day, hour, minute, second, milli; private static string fullPattern; private static string shortPattern; @@ -55,7 +55,7 @@ ComposePatterns(); } - internal MySqlDateTime( MySqlDbType type ) + internal MySqlDateTime(MySqlDbType type) { mySqlDbType = type; objectValue = this; @@ -69,6 +69,7 @@ hour = val.Hour; minute = val.Minute; second = val.Second; + milli = val.Millisecond; } #region Properties @@ -126,9 +127,15 @@ set { second = value; } } + public int Millisecond + { + get { return milli; } + set { milli = value; } + } + #endregion - private void SerializeText( PacketWriter writer, DateTime value ) + private void SerializeText(PacketWriter writer, MySqlDateTime value) { string val = String.Empty; @@ -146,20 +153,21 @@ internal override void Serialize(PacketWriter writer, bool binary, object value, int length) { - if (value is MySqlDateTime) - value = (value as MySqlDateTime).GetDateTime(); + MySqlDateTime dtValue; - if (value is string) - value = DateTime.Parse((string)value, - System.Globalization.CultureInfo.CurrentCulture); + if (value is DateTime) + dtValue = new MySqlDateTime((DateTime)value, MySqlDbType); + else if (value is string) + dtValue = new MySqlDateTime(DateTime.Parse((string)value, + System.Globalization.CultureInfo.CurrentCulture), MySqlDbType); + else if (value is MySqlDateTime) + dtValue = (MySqlDateTime)value; + else + throw new MySqlException("Unable to serialize date/time value."); - if (! (value is DateTime)) - throw new MySqlException( "Only DateTime objects can be serialized by MySqlDateTime" ); - - DateTime dtValue = (DateTime)value; if (! binary) { - SerializeText( writer, dtValue ); + SerializeText(writer, dtValue); return; } @@ -168,24 +176,24 @@ else writer.WriteByte( 7 ); - writer.WriteInteger( dtValue.Year, 2 ); - writer.WriteByte( (byte)dtValue.Month ); - writer.WriteByte( (byte)dtValue.Day ); + writer.WriteInteger(dtValue.Year, 2); + writer.WriteByte((byte)dtValue.Month); + writer.WriteByte((byte)dtValue.Day); if (mySqlDbType == MySqlDbType.Date) { - writer.WriteByte( 0 ); - writer.WriteByte( 0 ); - writer.WriteByte( 0 ); + writer.WriteByte(0); + writer.WriteByte(0); + writer.WriteByte(0); } else { - writer.WriteByte( (byte)dtValue.Hour ); - writer.WriteByte( (byte)dtValue.Minute ); - writer.WriteByte( (byte)dtValue.Second ); + writer.WriteByte((byte)dtValue.Hour); + writer.WriteByte((byte)dtValue.Minute); + writer.WriteByte((byte)dtValue.Second); } if (mySqlDbType == MySqlDbType.Timestamp) - writer.WriteInteger( dtValue.Millisecond, 4 ); + writer.WriteInteger(dtValue.Millisecond, 4); } internal override DbType DbType Modified: branches/1.0/mysqlclient/datareader.cs =================================================================== --- branches/1.0/mysqlclient/datareader.cs 2006-09-26 22:59:31 UTC (rev 365) +++ branches/1.0/mysqlclient/datareader.cs 2006-09-26 23:05:49 UTC (rev 366) @@ -377,9 +377,14 @@ { if (! isOpen) throw new Exception("No current query in data reader"); if (i >= fields.Length) throw new IndexOutOfRangeException(); - - if (currentResult[i] is MySqlDateTime && !connection.Settings.AllowZeroDateTime) - return typeof(DateTime); + + if (currentResult[i] is MySqlDateTime) + { + if (!connection.Settings.AllowZeroDateTime) + return typeof(DateTime); + return typeof(MySqlDateTime); + } + return currentResult[i].SystemType; }