@devlocal

Как переписать OdbcCommand для массовой вставки?

Как более правильно написать код. который подключается к mysql и вставляет в таблицу около 30 тыс записей.

var sqlCmd_KSLP = SqlClient.CreateCommand("SELECT KSLP, NSLP FROM SLP ORDER BY KSLP ASC");
                using (var reader = sqlCmd_KSLP.ExecReader())
                {
                    string my_queryString_insert = "insert into org_iogjt_import_org_gate_job_title (iogjt_jobtitle_id, iogjt_jobtitle_name, iogds_datasource_id) VALUES (?, ?, 1)";
                    OdbcCommand my_command_insert = new OdbcCommand(my_queryString_insert);
                    my_command_insert.Parameters.Add("@KSLP", OdbcType.Int);
                    my_command_insert.Parameters.Add("@NSLP", OdbcType.VarChar, 255);
                    my_command_insert.Connection = my_connection;

                    while (reader.Read())
                    {
                        var row = reader.GetObject(new { KSLP = 0, NSLP = "" });
                        if (row.KSLP != 0)
                        {
                            
                            my_command_insert.Parameters["@KSLP"].Value = row.KSLP.ToString();
                            my_command_insert.Parameters["@NSLP"].Value = row.NSLP.ToString();

                            my_command_insert.ExecuteNonQuery();
                        }
                    }
                }


Сейчас такой код выполняется больше одного часа.
  • Вопрос задан
  • 47 просмотров
Пригласить эксперта
Ответы на вопрос 4
lexxpavlov
@lexxpavlov
Программист, преподаватель
А сама база не сможет выполнить запрос вставки по выборке?
insert into org_iogjt_import_org_gate_job_title (iogjt_jobtitle_id, iogjt_jobtitle_name, iogds_datasource_id) 
    SELECT KSLP, NSLP, 1 FROM SLP WHERE KSLP <> 0 ORDER BY KSLP ASC

Тогда можно просто выполнить запрос, без цикла и без параметров.
Ответ написан
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Выше Вам дали вполне разумный совет. Плюс - отключайте индексацию на момент вставки. Скорость записи значительно увеличится.
Ответ написан
Комментировать
@Ascar
Можно использовать команду массовой вставки
INSERT INTO org_iogjt_import_org_gate_job_title (iogjt_jobtitle_id, iogjt_jobtitle_name, iogds_datasource_id) VALUES(@p1@p2,@p3)
,(@p4@p5,@p6)
,(@p7@p8,@p9), ...

В цикле дополняйте команду и присваивайте параметры
my_command_insert.Parameters.Add("@p"+i, SqlDbType.Int).Value = IncidentId;

Таким образом сгруппировав запрос за раз вставится больше строк.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы