From 4687b238f6e7e6bac5c35184251417e487d6634f Mon Sep 17 00:00:00 2001 From: cannero Date: Wed, 15 Mar 2023 22:08:35 +0100 Subject: [PATCH] Run inserts in batch command as one block A batch update did not run one insert statement per batch but multiple insert statements. The correct insert statements are already built but were not used. Fixes #71832 --- MySQL.Data/src/Statement.cs | 2 +- .../netstandard2_0/MySqlDataAdapterTests.cs | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/MySQL.Data/src/Statement.cs b/MySQL.Data/src/Statement.cs index 67487883..690bc952 100644 --- a/MySQL.Data/src/Statement.cs +++ b/MySQL.Data/src/Statement.cs @@ -178,7 +178,7 @@ protected virtual void BindParameters() //long originalLength = packet.Length - 4; // and attempt to stream the next command - string text = ResolvedCommandText; + string text = batchedCmd.BatchableCommandText; if (text.StartsWith("(", StringComparison.Ordinal)) packet.WriteStringNoNull(", "); else diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataAdapterTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataAdapterTests.cs index d683e71d..f5654883 100644 --- a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataAdapterTests.cs +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataAdapterTests.cs @@ -721,6 +721,43 @@ public void TestBatchingInsertsMoreThanMaxPacket() Assert.AreEqual(i, dt.Rows[i]["id"]); } + /// + /// Test similar to TestBatchingInserts, only that here a check is done that the + /// returned autoincrement id is the first one of the block to verify that all + /// rows are inserted as one batch. + /// + [Test] + public void TestBatchingInsertsAllRowsInOneGo() + { + ExecuteSQL("CREATE TABLE Test (id INT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test 1')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommand ins = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?p1, ?p2)", Connection); + da.InsertCommand = ins; + ins.UpdatedRowSource = UpdateRowSource.None; + ins.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; + ins.Parameters.Add("?p2", MySqlDbType.VarChar, 20).SourceColumn = "name"; + + DataTable dt = new DataTable(); + da.Fill(dt); + + for (int i = 1; i <= 3; i++) + { + DataRow row = dt.NewRow(); + row["id"] = DBNull.Value; + row["name"] = "name " + i; + dt.Rows.Add(row); + } + + da.UpdateBatchSize = 0; + da.Update(dt); + + var lastInsertedId = (ulong)ExecuteScalar("SELECT LAST_INSERT_ID();"); + + Assert.AreEqual(2, lastInsertedId); + } + [Test] public void FunctionsReturnString() {