Bug #29877 | MySQL Connector/Net 5.0.7 Not Updating auto_increment Primary Key Column | ||
---|---|---|---|
Submitted: | 18 Jul 2007 18:10 | Modified: | 13 Nov 2007 11:32 |
Reporter: | Matthew Bilek | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | Connector / NET | Severity: | S2 (Serious) |
Version: | 5.0.7 | OS: | Windows |
Assigned to: | MC Brown | CPU Architecture: | Any |
[18 Jul 2007 18:10]
Matthew Bilek
[6 Aug 2007 7:51]
Tonci Grgin
Hi Matthew and thanks for your report. Can you please attach small but complete test case showing this behavior?
[9 Aug 2007 15:32]
Matthew Bilek
Here is SQL to create the example table: CREATE DATABASE IF NOT EXISTS mysql_bug_29877; USE mysql_bug_29877 DROP TABLE IF EXISTS mysql_bug_29877; CREATE TABLE IF NOT EXISTS mysql_bug_29877 ( mysql_29877_id INTEGER UNSIGNED NOT NULL auto_increment, tinyint_value TINYINT UNSIGNED, smallint_value SMALLINT UNSIGNED, mediumint_value MEDIUMINT UNSIGNED, int_value INT UNSIGNED, bigint_value BIGINT UNSIGNED, datetime_value DATETIME, date_value DATE, timestamp_value TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, time_value TIME, year_value YEAR, char_value CHAR(10), varchar_value VARCHAR(10), binary_value BINARY(10), varbinary_value VARBINARY(10), tinyblob_value TINYBLOB, tinytext_value TINYTEXT, blob_value BLOB, text_value TEXT, mediumblob_value MEDIUMBLOB, mediumtext_value MEDIUMTEXT, longblob_value LONGBLOB, longtext_value LONGTEXT, enum_value ENUM('TINYINT','SMALLINT','MEDIUMINT','INT','BIGINT'), set_value SET('TINYINT','SMALLINT','MEDIUMINT','INT','BIGINT'), PRIMARY KEY (mysql_29877_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; Sample .Net code used to test the 1.0.7 and 5.0.7 .Net Connector: using System; using System.Collections.Generic; using System.Text; namespace MySQLBug29877 { class Program { static private MySql.Data.MySqlClient.MySqlConnection MySqlDataMySqlClientMySqlConnection = null; static private MySql.Data.MySqlClient.MySqlCommand MySqlDataMySqlClientMySqlCommand = null; static private MySql.Data.MySqlClient.MySqlDataAdapter MySqlDataMySqlClientMySqlDataAdapter = null; static private MySql.Data.MySqlClient.MySqlCommandBuilder MySqlDataMySqlClientMySqlCommandBuilder = null; static private System.Data.DataSet SystemDataDataSet = null; static private System.Data.DataView SystemDataDataView = null; static private System.Data.DataRow SystemDataDataRow = null; static private System.Byte[] SystemBytes = new System.Byte[] { (byte)'a', (byte)'b', (byte)'c'}; static void Main(string[] args) { try { Program.MySqlDataMySqlClientMySqlConnection = new MySql.Data.MySqlClient.MySqlConnection(); Program.MySqlDataMySqlClientMySqlCommand = new MySql.Data.MySqlClient.MySqlCommand(); Program.MySqlDataMySqlClientMySqlDataAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter(); Program.MySqlDataMySqlClientMySqlCommandBuilder = new MySql.Data.MySqlClient.MySqlCommandBuilder(); Program.SystemDataDataSet = new System.Data.DataSet(); Program.SystemDataDataView = new System.Data.DataView(); Program.MySqlDataMySqlClientMySqlConnection.ConnectionString = "Data Source=localhost;Port=3306;Database=mysql_bug_29877;User Id=MySQLBug29877;Password=MySQLBug29877;"; Program.MySqlDataMySqlClientMySqlConnection.Open(); Program.MySqlDataMySqlClientMySqlCommand.CommandType = System.Data.CommandType.Text; Program.MySqlDataMySqlClientMySqlCommand.Connection = Program.MySqlDataMySqlClientMySqlConnection; Program.MySqlDataMySqlClientMySqlCommand.CommandText = "SELECT * FROM mysql_bug_29877"; Program.MySqlDataMySqlClientMySqlDataAdapter.SelectCommand = Program.MySqlDataMySqlClientMySqlCommand; Program.MySqlDataMySqlClientMySqlDataAdapter.Fill(Program.SystemDataDataSet, "mysql_bug_29877"); Program.MySqlDataMySqlClientMySqlCommandBuilder.DataAdapter = Program.MySqlDataMySqlClientMySqlDataAdapter; Program.MySqlDataMySqlClientMySqlCommandBuilder.DataAdapter.SelectCommand.CommandText = "SELECT * FROM mysql_bug_29877"; Program.MySqlDataMySqlClientMySqlCommandBuilder.RefreshSchema(); Program.SystemDataDataView = Program.SystemDataDataSet.Tables["mysql_bug_29877"].DefaultView; Program.SystemDataDataRow = Program.SystemDataDataView.Table.NewRow(); SystemDataDataRow["tinyint_value"] = 1; SystemDataDataRow["smallint_value"] = 2; SystemDataDataRow["mediumint_value"] = 3; SystemDataDataRow["int_value"] = 4; SystemDataDataRow["bigint_value"] = 5; SystemDataDataRow["datetime_value"] = "2007-08-09 12:34:56"; SystemDataDataRow["date_value"] = "2007-08-09"; // SystemDataDataRow["timestamp_value"]; SystemDataDataRow["time_value"] = "12:34:56"; SystemDataDataRow["year_value"] = "2007"; SystemDataDataRow["char_value"] = "abc"; SystemDataDataRow["varchar_value"] = "abc"; SystemDataDataRow["binary_value"] = "abc"; SystemDataDataRow["varbinary_value"] = "abc"; SystemDataDataRow["tinyblob_value"] = SystemBytes; SystemDataDataRow["tinytext_value"] = "abc"; SystemDataDataRow["blob_value"] = SystemBytes; SystemDataDataRow["text_value"] = "abc"; SystemDataDataRow["mediumblob_value"] = SystemBytes; SystemDataDataRow["mediumtext_value"] = "abc"; SystemDataDataRow["longblob_value"] = SystemBytes; SystemDataDataRow["longtext_value"] = "abc"; SystemDataDataRow["enum_value"] = "INT"; SystemDataDataRow["set_value"] = "INT"; Program.SystemDataDataView.Table.Rows.Add(Program.SystemDataDataRow); Program.MySqlDataMySqlClientMySqlDataAdapter.Update(Program.SystemDataDataSet, "mysql_bug_29877"); } catch (System.Exception SystemException) { System.Console.WriteLine(SystemException.Message); } } } }
[9 Aug 2007 15:39]
Matthew Bilek
1.0.7 Results
Attachment: MySQL Bug 29877 1.0.7.doc (application/msword, text), 273.00 KiB.
[9 Aug 2007 15:39]
Matthew Bilek
5.0.7 Results
Attachment: MySQL Bug 29877 5.0.7.doc (application/msword, text), 274.00 KiB.
[13 Aug 2007 10:36]
Tonci Grgin
Hi Matthew. I'm having hard time following your code. Can you please simplify (see my attached test case) and loose v 1.0.x from all descriptions / synopsis?
[13 Aug 2007 10:37]
Tonci Grgin
Simplified test caes
Attachment: B29877.txt (application/x-download, text), 3.86 KiB.
[13 Aug 2007 14:38]
Bogdan Degtyariov
C# project
Attachment: _bug29877_vs2005.zip (application/not-important, text), 4.37 KiB.
[13 Aug 2007 15:16]
Matthew Bilek
Tonci, I have tested your test case against the MySQL Connector/Net 1.0.7 and 5.0.7 and get the same results. 1.0.7 would show that SystemDataDataRow["id"] = 1, but 5.0.7 shows that SystemDataDataRow["id"] = null. You should be able to use your test case to find and determine differences in the 1.0.7 and 5.0.7 versions.
[13 Aug 2007 18:32]
Tonci Grgin
Matthew, thank you. A colleague of mine reviewed the report and we decided that this *is* a bug. Verified as described on latest 5.0 sources.
[14 Aug 2007 2:48]
Reggie Burnett
This is not a bug. To get auto incremented values returned automatically, the user must set a property on the command builder. By adding the following code, the test case works with 5.0.7. cmdBuilder.ReturnGeneratedIdentifiers = true;
[14 Aug 2007 11:15]
Tonci Grgin
Thanks for clarification Reggie. Assigning to MC as this needs to be documented.
[14 Aug 2007 14:06]
Matthew Bilek
In our case it is a "bug" because it is not backward compatible with previous versions of the MySQL Connector/Net. Is MySQL saying they don't support backward compatibility for the MySQL Connector/Net???
[14 Aug 2007 14:35]
Matthew Bilek
I did however confirmed that MySQL Connector/Net 5.0.7 does return the auto incremented primary key when then the code is modified to set .ReturnGeneratedIdentifiers = true. This modification to the code works fine but is not backward compatable with legacy software.
[14 Aug 2007 15:36]
Reggie Burnett
After considering it further, we could set the default value of ReturnGeneratedIdentifers to true. It is still important to expose this property to allow a user to turn it off. We'll consider this for 5.0.8 and 5.1.3. Thanks
[14 Aug 2007 16:11]
Matthew Bilek
Thanks! I was talking to another peer developer which mentioned that some of our code does not use the command builder and still has the same problem. Is there a solution or workaround to set this flag even when the command builder is not used?
[14 Aug 2007 16:43]
Matthew Bilek
I want to clarify the problem. When the command builder is not used and a data adapter .Update() method is called the MySQL Connector/Net 1.0.7 would populate the auto increment column, but the MySQL Connector/Net 5.0.7 would not populate the auto increment column.
[16 Aug 2007 7:28]
MC Brown
Setting to Documenting
[13 Nov 2007 11:32]
MC Brown
The documentation has been updated with a new FAQ section, the first question of which details this issue and how to obtain the correct auto-increment-id in this situation.