From: Date: December 13 2006 5:41pm Subject: Connector/NET commit: r495 - in branches/1.0: . TestSuite mysqlclient mysqlclient/Types List-Archive: http://lists.mysql.com/commits/16891 X-Bug: 23862 Message-Id: <200612131641.kBDGfwVa001847@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/1.0/CHANGES branches/1.0/TestSuite/CommandBuilderTests.cs branches/1.0/mysqlclient/CommandBuilder.cs branches/1.0/mysqlclient/Types/MySqlUInt32.cs Log: Bug #23862 Problem with CommandBuilder 'GetInsertCommand' method Fixed by making sure the column is not auto increment before including it in the insert clause generated by MySqlCommandBuilder Modified: branches/1.0/CHANGES =================================================================== --- branches/1.0/CHANGES 2006-12-12 05:02:20 UTC (rev 494) +++ branches/1.0/CHANGES 2006-12-13 16:41:57 UTC (rev 495) @@ -9,6 +9,7 @@ Bug #18186 Problem with implementation of PreparedStatement Bug #24565 Inferring DbType fails when reusing commands and the first time the value is nul Bug #24661 mysql-connector-net-5.0.2-beta Driver.IsTooOld() Error.... + Bug #23862 Problem with CommandBuilder 'GetInsertCommand' method Other changes ------------- Modified: branches/1.0/TestSuite/CommandBuilderTests.cs =================================================================== --- branches/1.0/TestSuite/CommandBuilderTests.cs 2006-12-12 05:02:20 UTC (rev 494) +++ branches/1.0/TestSuite/CommandBuilderTests.cs 2006-12-13 16:41:57 UTC (rev 495) @@ -30,6 +30,7 @@ [TestFixtureSetUp] public void FixtureSetup() { + csAdditions += ";logging=true;"; Open(); } @@ -185,7 +186,8 @@ conn.ChangeDatabase("mysql"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name FROM test.test", conn); + MySqlDataAdapter da = new MySqlDataAdapter( + String.Format("SELECT id, name FROM {0}.test", database), conn); MySqlCommandBuilder cb = new MySqlCommandBuilder(da); cb.ToString(); // keep the compiler happy DataSet ds = new DataSet(); @@ -255,5 +257,42 @@ Assert.Fail(ex.Message); } } + + /// + /// Bug #23862 Problem with CommandBuilder 'GetInsertCommand' method + /// + [Test] + public void AutoIncrementColumnsOnInsert() + { + execSQL("DROP TABLE IF EXISTS test"); + execSQL("CREATE TABLE test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, " + + "name VARCHAR(100), PRIMARY KEY(id))"); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM test", conn); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + + DataTable dt = new DataTable(); + da.Fill(dt); + dt.Columns[0].AutoIncrement = true; + //Assert.IsTrue(dt.Columns[0].AutoIncrement); + dt.Columns[0].AutoIncrementSeed = -1; + dt.Columns[0].AutoIncrementStep = -1; + DataRow row = dt.NewRow(); + row["name"] = "Test"; + + try + { + dt.Rows.Add(row); + da.Update(dt); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + dt.Clear(); + da.Fill(dt); + Assert.AreEqual(1, dt.Rows.Count); + Assert.AreEqual(1, dt.Rows[0]["id"]); + Assert.AreEqual("Test", dt.Rows[0]["name"]); + } } } Modified: branches/1.0/mysqlclient/CommandBuilder.cs =================================================================== --- branches/1.0/mysqlclient/CommandBuilder.cs 2006-12-12 05:02:20 UTC (rev 494) +++ branches/1.0/mysqlclient/CommandBuilder.cs 2006-12-13 16:41:57 UTC (rev 495) @@ -466,10 +466,12 @@ { // If the parameter has one of these properties, then we don't include it in the insert: - /* if ((bool) schemaRow ["IsHidden"]) - return false; - if ((bool) schemaRow ["IsExpression"]) - return false;*/ + if ((bool)schemaRow["IsAutoIncrement"]) + return false; +/* if ((bool) schemaRow ["IsHidden"]) + return false; + if ((bool) schemaRow ["IsExpression"]) + return false;*/ if ((bool)schemaRow["IsRowVersion"]) return false; if ((bool)schemaRow["IsReadOnly"]) Modified: branches/1.0/mysqlclient/Types/MySqlUInt32.cs =================================================================== --- branches/1.0/mysqlclient/Types/MySqlUInt32.cs 2006-12-12 05:02:20 UTC (rev 494) +++ branches/1.0/mysqlclient/Types/MySqlUInt32.cs 2006-12-13 16:41:57 UTC (rev 495) @@ -24,63 +24,64 @@ namespace MySql.Data.Types { - /// - /// Summary description for MySqlInt32. - /// - internal class MySqlUInt32 : MySqlValue - { - private uint mValue; + /// + /// Summary description for MySqlInt32. + /// + internal class MySqlUInt32 : MySqlValue + { + private uint mValue; - public MySqlUInt32(MySqlDbType type) : base() - { - mySqlDbType = type; - } + public MySqlUInt32(MySqlDbType type) + : base() + { + mySqlDbType = type; + } - internal override void Serialize(PacketWriter writer, bool binary, object value, int length) - { - uint v = Convert.ToUInt32( value ); - if (binary) - writer.Write( BitConverter.GetBytes( v ) ); - else - writer.WriteStringNoNull( v.ToString() ); - } + internal override void Serialize(PacketWriter writer, bool binary, object value, int length) + { + uint v = Convert.ToUInt32(value); + if (binary) + writer.Write(BitConverter.GetBytes(v)); + else + writer.WriteStringNoNull(v.ToString()); + } - public uint Value - { - get { return mValue; } - set { mValue = value; objectValue = value; } - } + public uint Value + { + get { return mValue; } + set { mValue = value; objectValue = value; } + } - internal override Type SystemType - { - get { return typeof(UInt32); } - } + internal override Type SystemType + { + get { return typeof(UInt32); } + } - internal override string GetMySqlTypeName() - { - return "INT"; - } + internal override string GetMySqlTypeName() + { + return "INT"; + } - internal override MySqlValue ReadValue( PacketReader reader, long length ) - { - if (length == -1) - { - if (mySqlDbType == MySqlDbType.Int24) - Value = (uint)reader.ReadInteger( 3 ); - else - Value = (uint)reader.ReadLong( 4 ); - } - else - { - string value = reader.ReadString( length ); - Value = UInt32.Parse( value ); - } - return this; - } + internal override MySqlValue ReadValue(PacketReader reader, long length) + { + if (length == -1) + { + if (mySqlDbType == MySqlDbType.Int24) + Value = (uint)reader.ReadInteger(3); + else + Value = (uint)reader.ReadLong(4); + } + else + { + string value = reader.ReadString(length); + Value = UInt32.Parse(value); + } + return this; + } - internal override void Skip(PacketReader reader) - { - reader.Skip(4); - } - } + internal override void Skip(PacketReader reader) + { + reader.Skip(4); + } + } }