MySQLDataProvider.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. using mysql.Model;
  2. using MySql.Data.MySqlClient;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows;
  10. namespace mysql.Classes
  11. {
  12. class MySQLDataProvider: IDataProvider
  13. {
  14. private MySqlConnection Connection;
  15. private List<ProductType> ProductTypes = null;
  16. public MySQLDataProvider()
  17. {
  18. try
  19. {
  20. Connection = new MySqlConnection("Server=kolei.ru;Database=i31;port=3306;UserId=i31;password=qzesc;");
  21. }
  22. catch (Exception)
  23. {
  24. }
  25. }
  26. public IEnumerable<Product> GetProducts()
  27. {
  28. List<Product> ProductList = new List<Product>();
  29. string Query = @"SELECT
  30. p.*,
  31. pt.Title AS ProductTypeTitle,
  32. pp.MaterialList, pp.Total,Sales.DaysFromLastSale
  33. FROM
  34. Product p
  35. LEFT JOIN
  36. ProductType pt ON p.ProductTypeID = pt.ID
  37. LEFT JOIN
  38. (
  39. SELECT
  40. pm.ProductID,
  41. GROUP_CONCAT(m.Title SEPARATOR ', ') as MaterialList,
  42. SUM(pm.Count * m.Cost / m.CountInPack) as Total
  43. FROM
  44. Material m,
  45. ProductMaterial pm
  46. WHERE m.ID = pm.MaterialID
  47. GROUP BY ProductID
  48. ) pp ON pp.ProductID = p.ID
  49. LEFT JOIN
  50. (
  51. select
  52. ProductID,
  53. DATEDIFF(NOW(), max(SaleDate)) as DaysFromLastSale
  54. from
  55. ProductSale
  56. group by ProductID
  57. ) Sales on Sales.ProductID = p.ID";
  58. try
  59. {
  60. Connection.Open();
  61. try
  62. {
  63. MySqlCommand Command = new MySqlCommand(Query, Connection);
  64. MySqlDataReader Reader = Command.ExecuteReader();
  65. while (Reader.Read())
  66. {
  67. Product NewProduct = new Product();
  68. NewProduct.ID = Reader.GetInt32("ID");
  69. NewProduct.Title = Reader.GetString("Title");
  70. NewProduct.ArticleNumber = Reader.GetString("ArticleNumber");
  71. NewProduct.ProductionPersonCount = Reader.GetInt32("ProductionPersonCount");
  72. NewProduct.ProductionWorkshopNumber = Reader.GetInt32("ProductionWorkshopNumber");
  73. NewProduct.MinCostForAgent = Reader.GetInt32("MinCostForAgent");
  74. // Методы Get<T> не поддерживают работу с NULL
  75. // для полей, в которых может встретиться NULL (а лучше для всех)
  76. // используйте следующий синтаксис
  77. NewProduct.Description = Reader["Description"].ToString();
  78. NewProduct.Image = Reader["Image"].ToString();
  79. // NewProduct.ProductTypeID = Reader.GetInt32("ProductTypeID");
  80. // NewProduct.ProductTypeTitle = Reader["ProductTypeTitle"].ToString();
  81. NewProduct.CurrentProductType = GetProductType(Reader.GetInt32("ProductTypeID"));
  82. NewProduct.MaterialString = Reader["MaterialList"].ToString();
  83. NewProduct.Total = Reader["Total"].ToString();
  84. NewProduct.DaysFromLastSale = (Reader["DaysFromLastSale"] as int?) ?? 999;
  85. ProductList.Add(NewProduct);
  86. }
  87. }
  88. finally
  89. {
  90. Connection.Close();
  91. }
  92. }
  93. catch (Exception)
  94. {
  95. }
  96. return ProductList;
  97. }
  98. private ProductType GetProductType(int Id)
  99. {
  100. GetProductTypes();
  101. return ProductTypes.Find(pt => pt.ID == Id);
  102. }
  103. public IEnumerable<ProductType> GetProductTypes()
  104. {
  105. if (ProductTypes == null)
  106. {
  107. ProductTypes = new List<ProductType>();
  108. string Query = "SELECT * FROM ProductType";
  109. try
  110. {
  111. Connection.Open();
  112. try
  113. {
  114. MySqlCommand Command = new MySqlCommand(Query, Connection);
  115. MySqlDataReader Reader = Command.ExecuteReader();
  116. while (Reader.Read())
  117. {
  118. ProductType NewProductType = new ProductType();
  119. NewProductType.ID = Reader.GetInt32("ID");
  120. NewProductType.Title = Reader.GetString("Title");
  121. ProductTypes.Add(NewProductType);
  122. }
  123. }
  124. finally
  125. {
  126. Connection.Close();
  127. }
  128. }
  129. catch (Exception)
  130. {
  131. }
  132. }
  133. return ProductTypes;
  134. }
  135. public void SetAverageCostForAgent(List<int> ProductIds, decimal NewCost)
  136. {
  137. try
  138. {
  139. Connection.Open();
  140. try
  141. {
  142. string Query = "UPDATE Product SET MinCostForAgent=@MinCostForAgent WHERE ID=@ID";
  143. foreach (int item in ProductIds)
  144. {
  145. MySqlCommand Command = new MySqlCommand(Query, Connection);
  146. Command.Parameters.AddWithValue("@MinCostForAgent", NewCost);
  147. Command.Parameters.AddWithValue("@ID", item);
  148. Command.ExecuteNonQuery();
  149. }
  150. }
  151. finally
  152. {
  153. Connection.Close();
  154. }
  155. }
  156. catch (Exception)
  157. {
  158. }
  159. }
  160. public void SaveProduct(Product ChangedProduct)
  161. {
  162. Connection.Open();
  163. try
  164. {
  165. if (ChangedProduct.MinCostForAgent < 0)
  166. throw new Exception("Цена продукта не может быть отрицательной");
  167. if (ChangedProduct.ID == 0)
  168. {
  169. // новый продукт - добавляем запись
  170. string Query = @"INSERT INTO Product
  171. (Title,
  172. ProductTypeID,
  173. ArticleNumber,
  174. Description,
  175. Image,
  176. ProductionPersonCount,
  177. ProductionWorkshopNumber,
  178. MinCostForAgent)
  179. VALUES
  180. (@Title,
  181. @ProductTypeID,
  182. @ArticleNumber,
  183. @Description,
  184. @Image,
  185. @ProductionPersonCount,
  186. @ProductionWorkshopNumber,
  187. @MinCostForAgent)";
  188. MySqlCommand Command = new MySqlCommand(Query, Connection);
  189. Command.Parameters.AddWithValue("@Title", ChangedProduct.Title);
  190. Command.Parameters.AddWithValue("@ProductTypeID", ChangedProduct.CurrentProductType.ID);
  191. Command.Parameters.AddWithValue("@ArticleNumber", ChangedProduct.ArticleNumber);
  192. Command.Parameters.AddWithValue("@Description", ChangedProduct.Description);
  193. Command.Parameters.AddWithValue("@Image", ChangedProduct.Image);
  194. Command.Parameters.AddWithValue("@ProductionPersonCount", ChangedProduct.ProductionPersonCount);
  195. Command.Parameters.AddWithValue("@ProductionWorkshopNumber", ChangedProduct.ProductionWorkshopNumber);
  196. Command.Parameters.AddWithValue("@MinCostForAgent", ChangedProduct.MinCostForAgent);
  197. Command.ExecuteNonQuery();
  198. }
  199. else
  200. {
  201. // существующий продукт - изменяем запись
  202. string Query = @"UPDATE Product
  203. SET
  204. Title = @Title,
  205. ProductTypeID = @ProductTypeID,
  206. ArticleNumber = @ArticleNumber,
  207. Description = @Description,
  208. Image = @Image,
  209. ProductionPersonCount = @ProductionPersonCount,
  210. ProductionWorkshopNumber = @ProductionWorkshopNumber,
  211. MinCostForAgent = @MinCostForAgent
  212. WHERE ID = @ID";
  213. MySqlCommand Command = new MySqlCommand(Query, Connection);
  214. Command.Parameters.AddWithValue("@Title", ChangedProduct.Title);
  215. Command.Parameters.AddWithValue("@ProductTypeID", ChangedProduct.CurrentProductType.ID);
  216. Command.Parameters.AddWithValue("@ArticleNumber", ChangedProduct.ArticleNumber);
  217. Command.Parameters.AddWithValue("@Description", ChangedProduct.Description);
  218. Command.Parameters.AddWithValue("@Image", ChangedProduct.Image);
  219. Command.Parameters.AddWithValue("@ProductionPersonCount", ChangedProduct.ProductionPersonCount);
  220. Command.Parameters.AddWithValue("@ProductionWorkshopNumber", ChangedProduct.ProductionWorkshopNumber);
  221. Command.Parameters.AddWithValue("@MinCostForAgent", ChangedProduct.MinCostForAgent);
  222. Command.Parameters.AddWithValue("@ID", ChangedProduct.ID);
  223. Command.ExecuteNonQuery();
  224. }
  225. }
  226. finally
  227. {
  228. Connection.Close();
  229. }
  230. }
  231. }
  232. }