| Bug #50123 | Batch updates bug when UpdateBatchSize > 1 | ||
|---|---|---|---|
| Submitted: | 6 Jan 2010 22:29 | Modified: | 25 Feb 2010 10:11 |
| Reporter: | Alexander Caravitis | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / NET | Severity: | S2 (Serious) |
| Version: | 6.2.2 | OS: | Windows |
| Assigned to: | Reggie Burnett | CPU Architecture: | Any |
| Tags: | Batch updates | ||
[6 Jan 2010 22:29]
Alexander Caravitis
[19 Jan 2010 10:40]
Tonci Grgin
Test case:
// Change to use the MySqlCommandBuilder
bool useMySqlCommandBuilder = false;
int rowsToAdd = 20;
MySqlDataAdapter adapter = null;
MySqlCommand ins = null;
MySqlCommand ins2 = null;
string connString = "DataSource=opensol;Database=test;UserID=**;Password=**;PORT=**;logging=True;allow batch=true;use procedure bodies=true;pooling=false";
MySqlConnection conn = new MySqlConnection(connString);
conn.Open();
try
{
MySqlCommand comm = new MySqlCommand();
int changed = 0;
comm.Connection = conn;
Console.Out.WriteLine("Using useMySqlCommandBuilder={0}", useMySqlCommandBuilder);
// Drop the table
comm.CommandText = "DROP TABLE IF EXISTS bug50123";
changed = comm.ExecuteNonQuery();
Console.Out.WriteLine("Dropped bug50123: Changed {0} rows", changed);
// Create the table
comm.CommandText = "CREATE TABLE bug50123 " +
"(fldID INT NOT NULL, fldValue VARCHAR(50) NOT NULL, PRIMARY KEY(fldID))";
changed = comm.ExecuteNonQuery();
Console.Out.WriteLine("Created bug50123: Changed {0} rows", changed);
// Create the DataAdapter
//adapter = new MySqlDataAdapter();
adapter = new MySqlDataAdapter("SELECT * FROM bug50123", conn);
DataTable data = new DataTable();
adapter.Fill(data);
Console.Out.WriteLine("SELECT FROM bug50123: {0} rows", data.Rows.Count);
// Create the Insert command
MySqlCommandBuilder builder;
if (useMySqlCommandBuilder)
{
builder = new MySqlCommandBuilder(adapter);
ins = builder.GetInsertCommand();
//WA
builder.Dispose();
}
else
{
ins = new MySqlCommand(
"INSERT INTO bug50123(fldID, fldValue) VALUES (?p1, ?p2)", conn);
ins.Parameters.Add("p1", MySqlDbType.Int32).SourceColumn = "fldID";
ins.Parameters.Add("p2", MySqlDbType.String).SourceColumn = "fldValue";
}
// Set the Insert Command
ins.UpdatedRowSource = UpdateRowSource.None;
adapter.InsertCommand = ins;
adapter.UpdateBatchSize = 10;
for (int i = 0; i < rowsToAdd; i++)
{
DataRow row = data.NewRow();
row["fldID"] = i + 1;
row["fldValue"] = "ID = " + (i + 1);
data.Rows.Add(row);
}
// Do the update
changed = adapter.Update(data);
Console.Out.WriteLine("INSERT INTO bug50123: {0} rows", changed);
//UPDATE VIA SP
comm.CommandText = "DROP PROCEDURE IF EXISTS pbug50123";
comm.ExecuteNonQuery();
comm.CommandText = "CREATE PROCEDURE pbug50123(" +
"IN pfldID INT, IN pfldValue VARCHAR(50)) " +
"BEGIN INSERT INTO bug50123(fldID, fldValue) " +
"VALUES(pfldID, pfldValue); END";
comm.ExecuteNonQuery();
// Set the Insert Command
ins2 = new MySqlCommand();
ins2.Connection = conn;
ins2.CommandText = "pbug50123";
ins2.CommandType = CommandType.StoredProcedure;
ins2.Parameters.Add("pfldID", MySqlDbType.Int32).SourceColumn = "fldID";
ins2.Parameters.Add("pfldValue", MySqlDbType.String).SourceColumn = "fldValue";
ins2.UpdatedRowSource = UpdateRowSource.None;
adapter.InsertCommand = ins2;
adapter.UpdateBatchSize = 10;
for (int i = 21; i < 41; i++)
{
DataRow row = data.NewRow();
row["fldID"] = i + 1;
row["fldValue"] = "ID = " + (i + 1);
data.Rows.Add(row);
}
// Do the update
changed = adapter.Update(data);
Console.Out.WriteLine("INSERT INTO bug50123 via SP: {0} rows", changed);
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message + "\n" + ex.StackTrace);
Console.Out.WriteLine("ins.UpdatedRowSource = {0}", ins.UpdatedRowSource);
}
finally
{
conn.Close();
}
}
[19 Jan 2010 10:43]
Tonci Grgin
Hi Alexander and thanks for your report. Verified as described using test case pasted above. Output: Using useMySqlCommandBuilder=False Dropped bug50123: Changed 0 rows Created bug50123: Changed 0 rows SELECT FROM bug50123: 0 rows INSERT INTO bug50123: 20 rows WindowsFormsApplication1.vshost.exe Information: 0 : Retrieving procedure metadata for `test`.`pbug50123` from server. A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in System.Data.dll You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'pbug50123; pbug50123; pbug50123; pbug50123; pbug50123; pbug50123; pbug50123; pbu' at line 1 at ... Further more, there are several problems with latest sources and various. I'll be filing new bug reports for that.
[19 Feb 2010 15:44]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/100888 795 Reggie Burnett 2010-02-19 - fixed bug where a commands batchable command text was not getting reset when the command text was reset (bug #50444) - fixed bug where using a currently non-batchable command in a batch would throw an exception (bug #50123)
[19 Feb 2010 16:00]
Reggie Burnett
fixed in 6.0.6, 6.1.4, 6.2.3, 6.3.1+
[25 Feb 2010 10:11]
Tony Bedford
An entry has been added to the changelogs 6.0.6, 6.1.4, 6.2.3, 6.3.1: When the UpdateBatchSize property was set to a value greater than 1, only the first row was applied to the database.
