Таким образом, у меня действительно действительно очень большой предварительно скомпилированный набор запросов 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;
}
Кто-нибудь знает, в чем проблема?
//Вы можете использовать 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();
Для каждой переменной с шаблоном @name
вы должны создать параметр и @name
его значение:
cmd.Parameters.AddWithValue("@store_id0", 123);