Имеется DataTable с данными.
Как можно быстро залить большой объем данных в MySql?
На офф сайте нашел совет, что для увеличения скорости загрузки делаем
INSERT INTO ... VALUES (),()
Это единственный способ?
Достаточно шустрая штука получилась. Очень быстро идет вставка, если генерить VALUES (),()...
public void Append(DataTable dt, string dataBaseName, DbSchema dbSchema)
{
PreCheckDestinationDb(dt, dataBaseName, dbSchema);
var cmd = GetBulkInsertQuery(dt);
var sb = new StringBuilder();
int counter = 0;
int total = 0;
for (var index = 0; index < dt.Rows.Count; index++)
{
DataRow row = dt.Rows[index];
AppendInsertValues(row, sb);
counter++;
if (counter >= _insertBatchSize || index + 1 == dt.Rows.Count)
{
_conn.Execute(cmd + sb);
sb.Clear();
total += counter;
log.Debug($"Вставлено: {total}/{dt.Rows.Count}");
counter = 0;
}
}
}
public void AppendInsertValues(DataRow row, StringBuilder sb)
{
if (sb.Length != 0)
{
sb.Append(",");
}
sb.Append("(");
for (var index = 0; index < row.Table.Columns.Count; index++)
{
DataColumn column = row.Table.Columns[index];
sb.Append(DBNull.Value.Equals(row[column]) ? "NULL" : $"'{MySqlHelper.EscapeString(row[column].ToString())}'");
if (index + 1 != row.Table.Columns.Count)
{
sb.Append(",");
}
}
sb.Append(")");
}
string GetBulkInsertQuery(DataTable dt)
{
var fieldList = dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToList();
var cmd = $"INSERT INTO `{dt.TableName}` (";
foreach (var field in fieldList)
{
cmd += $"`{field}`,";
}
cmd = cmd.Remove(cmd.Length - 1) + ") VALUES";
return cmd;
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости