На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Запись данных в БД MySQL
    Уважаемое сообщество, подскажите, пожалуйста, в решении проблемки:rolleyes:
    Столкнулся вот с чем: мне просто необходимо записать данные, полученные по сети. Для этого я написал простенькую либу (использую MySQL Connector Net 6.8.3):
    ExpandedWrap disabled
      ...
      using (MySqlCommand cmd = mConnection.CreateCommand())
                  {
                      cmd.CommandText = "insert into packets (Times, Timems, SystemCod, PacketType, DataPacket) values (@1,@2,@3,@4,@5)";
                      cmd.Parameters.AddWithValue("@1", time);
                      cmd.Parameters.AddWithValue("@2", timems);
                      cmd.Parameters.AddWithValue("@3", SysCod);
                      cmd.Parameters.AddWithValue("@4", PacType);
                      cmd.Parameters.AddWithValue("@5", data);
                      cmd.ExecuteNonQuery();
                  }

    Соответственно код просто вызывает метод из этой либы и записывает данные в БД....
    Так вот у меня есть два варианта:
    1 - это группа приложений, которые обрабатывают свой тип данных;
    2 - одно приложение с несколькими потоками.
    В первом случаи время записи в БД 30 пакетов (принял пакет - записал в БД, ... ) составляет около 160 мс.
    Во втором - около секунды:confused:
    С чем это может быть связано?
    Можно, конечно, предположить , что время уходит на создание и удаление объекта команд, но тогда почему такая разница между вариантами:confused:
    Я попытался сделать создание объекта команд глобальным, но тогда вылетает исключение: "параметр @1 уже определён":
    ExpandedWrap disabled
      MySqlCommand cmd;
      ...
      try
                  {
                      mConnection.Open();
                      cmd = mConnection.CreateCommand()
                  }
      ...
      cmd.CommandText = "insert into packets (Times, Timems, SystemCod, PacketType, DataPacket) values (@1,@2,@3,@4,@5)";
                      cmd.Parameters.AddWithValue("@1", time);
                      cmd.Parameters.AddWithValue("@2", timems);
                      cmd.Parameters.AddWithValue("@3", SysCod);
                      cmd.Parameters.AddWithValue("@4", PacType);
                      cmd.Parameters.AddWithValue("@5", data);
                      cmd.ExecuteNonQuery();


    Подскажите, пожалуйста, с чем это связано?

    Попытался использовать строку запроса вместо параметров:
    ExpandedWrap disabled
      string sql = string.Format("insert into packets (Times, Timems, SystemCod, PacketType, DataPacket) values" +
                                             "('{0}','{1}','{2}','{3}','{4}')", time, timems, SysCod, PacType, answerPaket);

    выдаёт исключение: "Данные слишком длинные для колонки", хотя размерности совпадают :unsure:
    Сообщение отредактировано: Дмитрий -
      а конекшн глобальный?
        Цитата SPM @
        Нет, я в каждом потоке создаю отдельное соединение.
          Цитата SPM @
          Подскажите, пожалуйста, с чем это связано?

          cmd.Parameters["@1"].Value = time;
            Relaxander, спасибо, учёл :)
              Подскажите, пожалуйста, а есть ли возможность в MYSQL записать блок данных в таблицу: сначала формирую таблицу , аналог таблицы БД, заполняю её, а потом одной командой записываю в БД?
              Что то похожее на MySqlBulkLoader?
                  Relaxander, спасибо за подсказку.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0246 ]   [ 16 queries used ]   [ Generated: 23.04.24, 14:11 GMT ]