Description:
In function MySqlParameter.Clone didn't set SourceColumnNullMapping to correct value.
If current parameter's SourceColumnNullMapping property is true; the cloned object will have SourceColumnNullMapping = false.
This will cause later use of cloned parameter can't be treated as right.
System.Data.Common.DbDataAdapter.ParameterInput
DbParameter dbParameter = dataParameter as DbParameter;
if (dbParameter != null && dbParameter.SourceColumnNullMapping)
{
dataParameter.Value = (ADP.IsNull(dataParameter.Value) ? DbDataAdapter.ParameterValueNullValue : DbDataAdapter.ParameterValueNonNullValue);
}
How to repeat:
MySqlCommand cmd = new MySqlCommand("CREATE TABLE `nullable` (`id` INT AUTO_INCREMENT,`name` VARCHAR(10) NULL, PRIMARY KEY(`id`))", connection);
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO `nullable` VALUES (1, null)";
cmd.ExecuteNonQuery();
MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM `nullable`", connection);
MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
da.DeleteCommand = cb.GetDeleteCommand().Clone();
cb.DataAdapter = null;
DataTable dt = new DataTable();
da.Fill(dt);
dt.Rows[0].Delete();
da.Update(dt);
exception caught:
System.Data.DBConcurrencyException: Concurrency violation: the DeleteCommand affected 0 of the expected 1 records.