| Bug #65065 | ConstraintException when filling a datatable | ||
|---|---|---|---|
| Submitted: | 22 Apr 2012 18:17 | Modified: | 28 Jun 2013 2:30 |
| Reporter: | Marc-André Beaulieu | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / NET | Severity: | S1 (Critical) |
| Version: | 6.5.4 | OS: | Windows |
| Assigned to: | Fernando Gonzalez.Sanchez | CPU Architecture: | Any |
| Tags: | ConstraintException, DataTable, fill | ||
[22 Apr 2012 18:17]
Marc-André Beaulieu
[26 Apr 2012 15:59]
Valeriy Kravchuk
Please, provide the exact query used and the results of SHOW CREATE TABLE for all tables involved in it.
[27 Apr 2012 3:27]
Marc-André Beaulieu
Here are my tables: 'trx', 'CREATE TABLE `trx` ( `id_trx` int(10) unsigned NOT NULL AUTO_INCREMENT, `mnt` decimal(9,2) NOT NULL, `dat_trx` date NOT NULL, `typ_trx` varchar(45) COLLATE utf8_bin DEFAULT NULL, `descr` tinytext COLLATE utf8_bin, `id_camn` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id_trx`), UNIQUE KEY `id_trx_UNIQUE` (`id_trx`), KEY `fk_trx_camn` (`id_camn`), CONSTRAINT `fk_trx_camn` FOREIGN KEY (`id_camn`) REFERENCES `camn` (`id_camn`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin' 'camn', 'CREATE TABLE `camn` ( `id_camn` int(10) unsigned NOT NULL AUTO_INCREMENT, `no` int(4) unsigned NOT NULL, `marq` varchar(45) COLLATE utf8_bin DEFAULT NULL, `modl` varchar(45) COLLATE utf8_bin DEFAULT NULL, `no_serie` varchar(17) COLLATE utf8_bin DEFAULT NULL, `no_plaq` varchar(7) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id_camn`), UNIQUE KEY `id_camn_UNIQUE` (`id_camn`), UNIQUE KEY `no_UNIQUE` (`no`), UNIQUE KEY `no_serie_UNIQUE` (`no_serie`), UNIQUE KEY `no_plaq_UNIQUE` (`no_plaq`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_bin' That is my query : SELECT cam.no_serie, t.mnt FROM trx t LEFT JOIN camn cam USING(id_camn) This is my stacktrace: System.Data.ConstraintException: Impossible d'activer les contraintes. Une ou plusieurs lignes contiennent des valeurs qui violent les contraintes de type non null, unique ou de clé externe. à System.Data.DataTable.EnableConstraints() à System.Data.DataTable.set_EnforceConstraints(Boolean value) à System.Data.DataTable.EndLoadData() à System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) à System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) à System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) à System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler) à System.Data.DataTable.Load(IDataReader reader) à ITDEVX.Service.COM.UtilitaireMySQL.CommandHelper.ExecuteDataTable() dans C:\Users\Marc-Andre\Documents\Visual Studio 2010\Projects\ITDEVX.Service.COM.UtilitaireMySQL\CommandHelper.vb:ligne 613
[11 May 2012 8:23]
Bogdan Degtyariov
The problem is not repeatable on empty tables. Can you please provide the data for both tables too? Thanks.
[16 May 2012 0:40]
Marc-André Beaulieu
Here are my inserts: INSERT INTO camn(id_camn, no, marq, modl, no_serie, no_plaq) VALUES(9, 3327, null, null, null, null); INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(1, 10, '2012-04-30', null, null, 9); INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(2, 10, '2012-04-15', null, null, 9); INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(3, 10, '2012-04-15', null, null, null); Note that the problem doesn't appear on empty tables.
[21 May 2012 12:21]
Bogdan Degtyariov
Verified.
Fails with the following error:
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints. at System.Data.DataTable.EnableConstraints()\r\n at System.Data.DataTable.set_EnforceConstraints(Boolean value)\r\n at System.Data.DataTable.EndLoadData()\r\n at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)\r\n at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)\r\n at System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)\r\n at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)\r\n at System.Data.DataTable.Load(IDataReader reader)\r\n at _issues.Form1.b65065_Click(Object sender, EventArgs e)
----------------------------------------------------------------------------
private void b65065_Click(object sender, EventArgs e)
{
MySqlConnection con = new MySqlConnection();
try
{
con.ConnectionString = "server=localhost;database=test;" +
"user id=*********;Password=*********;";
con.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.CommandText = "DROP TABLE IF EXISTS trx";
cmd.ExecuteNonQuery();
cmd.CommandText = "DROP TABLE IF EXISTS camn";
cmd.ExecuteNonQuery();
cmd.CommandText = "CREATE TABLE `camn` (" +
"`id_camn` int(10) unsigned NOT NULL AUTO_INCREMENT," +
"`no` int(4) unsigned NOT NULL," +
"`marq` varchar(45) COLLATE utf8_bin DEFAULT NULL," +
"`modl` varchar(45) COLLATE utf8_bin DEFAULT NULL," +
"`no_serie` varchar(17) COLLATE utf8_bin DEFAULT NULL," +
"`no_plaq` varchar(7) COLLATE utf8_bin DEFAULT NULL," +
"PRIMARY KEY (`id_camn`)," +
"UNIQUE KEY `id_camn_UNIQUE` (`id_camn`)," +
"UNIQUE KEY `no_UNIQUE` (`no`)," +
"UNIQUE KEY `no_serie_UNIQUE` (`no_serie`)," +
"UNIQUE KEY `no_plaq_UNIQUE` (`no_plaq`)" +
") ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_bin";
cmd.ExecuteNonQuery();
cmd.CommandText = "CREATE TABLE `trx` (" +
"`id_trx` int(10) unsigned NOT NULL AUTO_INCREMENT," +
"`mnt` decimal(9,2) NOT NULL," +
"`dat_trx` date NOT NULL," +
"`typ_trx` varchar(45) COLLATE utf8_bin DEFAULT NULL," +
"`descr` tinytext COLLATE utf8_bin," +
"`id_camn` int(10) unsigned DEFAULT NULL," +
"PRIMARY KEY (`id_trx`)," +
"UNIQUE KEY `id_trx_UNIQUE` (`id_trx`)," +
"KEY `fk_trx_camn` (`id_camn`)," +
"CONSTRAINT `fk_trx_camn` FOREIGN KEY (`id_camn`) REFERENCES `camn` (`id_camn`) ON DELETE NO ACTION ON UPDATE NO ACTION" +
") ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO camn(id_camn, no, marq, modl, no_serie, no_plaq) VALUES(9, 3327, null, null, null, null);";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(1, 10, '2012-04-30', null, null, 9);";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(2, 10, '2012-04-15', null, null, 9);";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(3, 10, '2012-04-15', null, null, null);";
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT cam.no_serie, t.mnt FROM trx t LEFT JOIN camn cam USING(id_camn) ";
MySqlDataReader dr = cmd.ExecuteReader();
DataTable dataTable = new DataTable();
dataTable.Load(dr);
dr.Close();
MessageBox.Show("Success!");
}
catch (Exception ex)
{
string error = ex.Message.ToString();
error += ex.StackTrace;
MessageBox.Show("=============================================\r\n" +
"Error!\r\n" + error + "\r\n" +
"=============================================\r\n");
}
finally
{
con.Close();
}
}
[11 Oct 2012 4:06]
Fernando Gonzalez.Sanchez
We are working on this, lowering the priority because there are two workarounds:
a) Return a query that includes a unique value
b) Use a DataSet to populate the DataTable, to use EnforceConstraints like this:
cmd.CommandText = "SELECT cam.no_serie, t.mnt FROM trx t LEFT JOIN camn cam USING(id_camn) ";
MySqlDataReader dr = cmd.ExecuteReader();
DataSet ds = new DataSet();
DataTable dataTable = new DataTable();
ds.Tables.Add(dataTable);
ds.EnforceConstraints = false;
dataTable.Load(dr);
dr.Close();
[28 Jun 2013 2:30]
Philip Olson
Fixed as of the upcoming Connector/Net 6.5.7, 6.6.6, and 6.7.4 releases, and here's the changelog entry: An exception was thrown when populating "DataTable" with query fields containing a "UNIQUE" index or constraint "NULL". There is no longer an exception thrown, and the "DataTable.Fill" method terminates correctly (filling the data). Thank you for the bug report.
