Как я могу выполнить несколько запросов MySQL одновременно в C #?

0

Таким образом, у меня действительно действительно очень большой предварительно скомпилированный набор запросов MySQL. Этот запрос отлично работает за пределами моего приложения С#, но когда я пытаюсь выполнить его в своем приложении С#, я сталкиваюсь с проблемой. Обратите внимание, что я НЕ могу изменить сам запрос и не могу перекомпилировать его в коде, мне нужно его выполнить как есть.

Сам запрос состоит из множества различных запросов, которые следуют следующему шаблону:

DELETE FROM stores WHERE region_id = 1;
INSERT INTO stores (region_id, name, score, type) VALUES (17, '1', 0, 'Profit'),(17, '2', 0, 'Profit'),(17, '3', 0, 'Profit'),(17, '4', 0, 'Profit'),(17, '5', 0, 'Profit'),(17, '6', 0, 'NonProfit'),(17, '7', 0, 'NonProfit'),(17, '8', 0, 'NonProfit'),(17, '9', 0, 'NonProfit'),(17, '10', 0, 'NonProfit');
SELECT id INTO @store_id0 FROM stores WHERE region_id=17 AND name = '1' AND type = 'Profit';
INSERT INTO store_merch(store_id, item_id, stock) VALUES (@store_id0, 1360, 0),(@store_id0, 440, 5);

Это работает, как и ожидалось, когда я выполняю его на чем-то вроде navicat (инструмент управления базами данных), но с моей программой С# он генерирует следующее исключение:

Параметр '@store_id0' должен быть определен.

Здесь моя функция Query Execute...

  public bool ExecuteQuery(
     string raw_query)
  {
     if (this.Open() == true)
     {
        //Create Command
        MySqlCommand cmd = new MySqlCommand(raw_query, connection);

        try
        {
           int changed_rows = cmd.ExecuteNonQuery();
           if (changed_rows > 0)
           {
              this.Close();
              return true;
           }
           else
           {
              Logger.GetInstance().Error("MySQLConnection::ExecuteQuery", "Zero records changed for in raw query.");
           }
        }
        catch (MySqlException e)
        {
           Logger.GetInstance().Error("MySQLConnection::ExecuteQuery", e.Message);
        }

        this.Close();
     }

     return false;
  }

Кто-нибудь знает, в чем проблема?

  • 0
    Я плохо знаю API базы данных C #, но в Java невозможно смешивать операторы DML и не DML с одним и тем же API.
  • 1
    Возможно ли вам просто установить Allow User Variables в строке подключения ? Я также вижу несколько советов о том, что вам может потребоваться обновить поставщика данных MySQL; более новые версии используют вопросительные знаки вместо @variables, чтобы избежать этого столкновения между пользовательскими переменными и параметрами.
Показать ещё 3 комментария
Теги:

2 ответа

-1

//Вы можете использовать StringBuilder и писать больше, чем запросы

StringBuilder strb = new StringBuilder(); strb.Append("SELECT IncentiveCode as Code, IncentiveDescription as PoliceyName");

            strb.Append(" IncPeriodCode as IncetvePeriodCode, PolP.PoliceyPeriodDesc as IncetivePeriodName,");

            strb.Append(" EffectedDate ,EndDate ,pol.SuppCode as SuppCode ,comp.SuppName as SuppName,pol.IsActive from IncentivePolicey pol");

            strb.Append(" LEFT outer join IncentivePoliceyPeriod PolP");
            strb.Append(" ON pol.IncPeriodCode = PolP.PoliceyPeriodCode");

            strb.Append(" LEFT OUTER JOIN Inventory_Suppliers comp ON pol.SuppCode = comp.SuppCode");

sqlcommandText = strb.toString();

  • 0
    strb является объектом StringBuilder
  • 0
    Например, StringBuilder strb = new StringBuilder ();
-2

Для каждой переменной с шаблоном @name вы должны создать параметр и @name его значение:

cmd.Parameters.AddWithValue("@store_id0", 123);
  • 0
    Это то, что SELECT id INTO @ store_id0 FROM хранит WHERE region_id = 17 AND name = '1' AND type = 'Profit'; запрос для, это должно быть выполнимо через строго MySQL, поскольку он отлично работает везде.
  • 2
    В этом контексте значение, присвоенное в @ store_id0, не имеет смысла. Однако, если у вас есть параметр в вашем запросе, вы все равно должны добавить соответствующий в коллекции параметров.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню