Je charge un paquet de lignes dans MySQL en C#. Dans MS Sql, je peux alimenter un DataReader en SqlBulkCopy, mais MySqlBulkCopy ne se présente que comme un bootstrap pour un chargement en masse à partir d'un fichier. Donc, ma solution actuelle utilise une commande préparée dans une boucle transactionnelle.MySql BulkCopy/Insert from DataReader
Existe-t-il un moyen plus rapide pour effectuer le chargement en bloc de MySQL à l'aide d'une source DataReader?
Voici le code.
public override void WriteToServer(IDataReader reader)
{
const string insertFormat = "insert into `{3}`.`{0}` ({1}) values ({2});";
string names = string.Join(",",
_command.Parameters.Cast<MySqlParameter>().Select(p => p.ParameterName).ToArray());
string vals = string.Join(",",
_command.Parameters.Cast<MySqlParameter>().Select(p => "?" + p.ParameterName).
ToArray());
_command.CommandText = string.Format(insertFormat, _table, names, vals, _schema);
int reportCounter = 0;
int totalRecords = 0;
bool finished = false;
using (var connection = new MySqlConnection(_source))
{
connection.Open();
_command.Connection = connection;
_command.Prepare();
while (!finished)
{
using (MySqlTransaction dbTrans = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
{
for (int i = 0; i < BatchSize; i++)
{
if (!reader.Read())
{
finished = true;
break;
}
try
{
for (int p = 0; p < _command.Parameters.Count; p++)
{
_command.Parameters[p].Value = reader.GetValue(p);
}
_command.ExecuteNonQuery();
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
reportCounter++;
totalRecords++;
if (reportCounter >= NotifyAfter)
{
reportCounter = 0;
OnSqlRowsCopied(new SqlRowsCopiedEventArgs(totalRecords));
}
}
dbTrans.Commit();
}
}
}
}
D'accord, et j'ai donné un coup de feu et a rencontré un problème de taille de paquet. Je crée la commande db via et n'ai pas trouvé d'instruction DDL pour définir la taille maximale des paquets. Donc, en tirant parti de votre expérience, je dois d'une manière ou d'une autre déterminer par programmation le point bascule entre mmap() et malloc(), définir ma taille de paquet juste en dessous, et préparer la commande d'insertion principale en conséquence. Vous avez raison? Un autre problème qui peut réduire l'efficacité est que les données source ont de grands champs de texte. –