Skip to content

Commit 17646b6

Browse files
committed
Rewrite ExecuteBatch with MySqlBatch. Fixes #675
1 parent a28e8a0 commit 17646b6

File tree

2 files changed

+38
-23
lines changed

2 files changed

+38
-23
lines changed

src/MySqlConnector/MySql.Data.MySqlClient/MySqlCommand.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ private MySqlCommand(MySqlCommand other)
5252
{
5353
m_commandTimeout = other.m_commandTimeout;
5454
m_commandType = other.m_commandType;
55-
var parameters = Parameters;
5655
DesignTimeVisible = other.DesignTimeVisible;
5756
UpdatedRowSource = other.UpdatedRowSource;
58-
foreach (MySqlParameter parameter in other.Parameters)
59-
parameters.Add(parameter.Clone());
57+
m_parameterCollection = other.CloneRawParameters();
6058
}
6159

6260
public new MySqlParameterCollection Parameters
@@ -102,6 +100,16 @@ public override void Prepare()
102100
public override Task PrepareAsync(CancellationToken cancellationToken = default) => PrepareAsync(AsyncIOBehavior, cancellationToken);
103101
#endif
104102

103+
internal MySqlParameterCollection CloneRawParameters()
104+
{
105+
if (m_parameterCollection is null)
106+
return null;
107+
var parameters = new MySqlParameterCollection();
108+
foreach (MySqlParameter parameter in m_parameterCollection)
109+
parameters.Add(parameter.Clone());
110+
return parameters;
111+
}
112+
105113
private Task PrepareAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
106114
{
107115
if (!NeedsPrepare(out var exception))

src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataAdapter.cs

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Data;
55
using System.Data.Common;
6+
using MySqlConnector.Core;
67

78
namespace MySql.Data.MySqlClient
89
{
@@ -67,38 +68,44 @@ public MySqlDataAdapter(string selectCommandText, string connectionString)
6768

6869
public override int UpdateBatchSize { get; set; }
6970

70-
protected override void InitializeBatching() => m_batchCommands = new List<MySqlCommand>();
71+
protected override void InitializeBatching() => m_batch = new MySqlBatch();
7172

7273
protected override void TerminateBatching()
7374
{
74-
if (m_batchCommands is object)
75-
ClearBatch();
76-
m_batchCommands = null;
75+
m_batch?.Dispose();
76+
m_batch = null;
7777
}
7878

7979
protected override int AddToBatch(IDbCommand command)
8080
{
81-
var count = m_batchCommands.Count;
82-
m_batchCommands.Add(((MySqlCommand) command).Clone());
81+
var mySqlCommand = (MySqlCommand) command;
82+
if (m_batch.Connection is null)
83+
{
84+
m_batch.Connection = mySqlCommand.Connection;
85+
m_batch.Transaction = mySqlCommand.Transaction;
86+
}
87+
88+
var count = m_batch.BatchCommands.Count;
89+
var batchCommand = new MySqlBatchCommand
90+
{
91+
CommandText = command.CommandText,
92+
CommandType = command.CommandType,
93+
};
94+
if (mySqlCommand.CloneRawParameters() is MySqlParameterCollection clonedParameters)
95+
{
96+
foreach (var clonedParameter in clonedParameters)
97+
batchCommand.Parameters.Add(clonedParameter);
98+
}
99+
100+
m_batch.BatchCommands.Add(batchCommand);
83101
return count;
84102
}
85103

86-
protected override void ClearBatch()
87-
{
88-
foreach (var command in m_batchCommands)
89-
command.Dispose();
90-
m_batchCommands.Clear();
91-
}
104+
protected override void ClearBatch() => m_batch.BatchCommands.Clear();
92105

93-
protected override int ExecuteBatch()
94-
{
95-
var result = 0;
96-
foreach (var command in m_batchCommands)
97-
result += command.ExecuteNonQuery();
98-
return result;
99-
}
106+
protected override int ExecuteBatch() => m_batch.ExecuteNonQuery();
100107

101-
List<MySqlCommand> m_batchCommands;
108+
MySqlBatch m_batch;
102109
}
103110

104111
public delegate void MySqlRowUpdatingEventHandler(object sender, MySqlRowUpdatingEventArgs e);

0 commit comments

Comments
 (0)