Program.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. using System.Text;
  2. using Npgsql;
  3. class TrainingDatabase
  4. {
  5. private NpgsqlConnection conn;
  6. private bool IsValidPhone(string phone)
  7. {
  8. if (phone.Length != 11) return false;
  9. foreach (char c in phone)
  10. {
  11. if (!char.IsDigit(c)) return false;
  12. }
  13. return true;
  14. }
  15. private void ExecuteQuery(string query, NpgsqlParameter[] parameters = null)
  16. {
  17. using (var cmd = new NpgsqlCommand(query, conn))
  18. {
  19. if (parameters != null)
  20. cmd.Parameters.AddRange(parameters);
  21. try
  22. {
  23. cmd.ExecuteNonQuery();
  24. }
  25. catch (Exception ex)
  26. {
  27. Console.WriteLine("Ошибка: " + ex.Message);
  28. }
  29. }
  30. }
  31. private bool IsConnected()
  32. {
  33. return conn.State == System.Data.ConnectionState.Open;
  34. }
  35. public TrainingDatabase()
  36. {
  37. string connectionString = "Host=edu-pg.itiscaf.ru;Port=5432;Database=dbwork;Username=andreev_as;Password=S5#&H680$KE";
  38. conn = new NpgsqlConnection(connectionString);
  39. try
  40. {
  41. conn.Open();
  42. Console.WriteLine("Подключение успешно");
  43. }
  44. catch (Exception ex)
  45. {
  46. Console.WriteLine("Не удалось подключиться к базе данных: " + ex.Message);
  47. Environment.Exit(1);
  48. }
  49. }
  50. ~TrainingDatabase()
  51. {
  52. if (conn != null)
  53. conn.Close();
  54. }
  55. private string ConvertToUtf8(string text)
  56. {
  57. if (string.IsNullOrEmpty(text)) return text;
  58. byte[] win1251Bytes = Encoding.GetEncoding(1251).GetBytes(text);
  59. return Encoding.UTF8.GetString(win1251Bytes);
  60. }
  61. public void AddUser()
  62. {
  63. string name, secondName, lastName, phone;
  64. int membershipId;
  65. Console.Write("Имя: ");
  66. name = Console.ReadLine();
  67. Console.Write("Фамилия: ");
  68. secondName = Console.ReadLine();
  69. Console.Write("Отчество: ");
  70. lastName = Console.ReadLine();
  71. Console.Write("Телефон (11 цифр): ");
  72. phone = Console.ReadLine();
  73. if (!IsValidPhone(phone))
  74. {
  75. Console.WriteLine("Ошибка: телефон должен содержать 11 цифр");
  76. return;
  77. }
  78. Console.Write("id абонемента: ");
  79. membershipId = int.Parse(Console.ReadLine());
  80. string getMembershipQuery = "select total_sessions, validity_days from membership where id = @id";
  81. using (var cmd = new NpgsqlCommand(getMembershipQuery, conn))
  82. {
  83. cmd.Parameters.AddWithValue("@id", membershipId);
  84. using (var reader = cmd.ExecuteReader())
  85. {
  86. if (reader.Read())
  87. {
  88. int totalSessions = reader.GetInt32(0);
  89. int validityDays = reader.GetInt32(1);
  90. DateTime validUntil = DateTime.Now.AddDays(validityDays);
  91. reader.Close();
  92. string insertQuery = "insert into users_gym (users_name, users_second_name, users_last_name, phone, membership_id, remaining_sessions, valid_until) values (@name, @secondName, @lastName, @phone, @membershipId, @remaining, @validUntil)";
  93. using (var insertCmd = new NpgsqlCommand(insertQuery, conn))
  94. {
  95. insertCmd.Parameters.AddWithValue("@name", name);
  96. insertCmd.Parameters.AddWithValue("@secondName", secondName);
  97. insertCmd.Parameters.AddWithValue("@lastName", lastName);
  98. insertCmd.Parameters.AddWithValue("@phone", phone);
  99. insertCmd.Parameters.AddWithValue("@membershipId", membershipId);
  100. insertCmd.Parameters.AddWithValue("@remaining", totalSessions);
  101. insertCmd.Parameters.AddWithValue("@validUntil", validUntil);
  102. int rows = insertCmd.ExecuteNonQuery();
  103. }
  104. Console.WriteLine("Пользователь добавлен");
  105. }
  106. else
  107. {
  108. Console.WriteLine("Абонемент с таким id не найден");
  109. }
  110. }
  111. }
  112. }
  113. public void AddTraining()
  114. {
  115. string sessionDate;
  116. int userId, coachId, hallId;
  117. Console.Write("id пользователя: ");
  118. userId = int.Parse(Console.ReadLine());
  119. Console.Write("id тренера: ");
  120. coachId = int.Parse(Console.ReadLine());
  121. Console.Write("id зала: ");
  122. hallId = int.Parse(Console.ReadLine());
  123. Console.Write("Дата тренировки (гггг-мм-дд): ");
  124. sessionDate = Console.ReadLine();
  125. DateTime date;
  126. if (!DateTime.TryParse(sessionDate, out date))
  127. {
  128. Console.WriteLine("Неверный формат даты");
  129. return;
  130. }
  131. string query = "insert into training_session (session_date, user_id, coach_id, hall_id) values (@date, @userId, @coachId, @hallId)";
  132. using (var cmd = new NpgsqlCommand(query, conn))
  133. {
  134. cmd.Parameters.AddWithValue("@date", date);
  135. cmd.Parameters.AddWithValue("@userId", userId);
  136. cmd.Parameters.AddWithValue("@coachId", coachId);
  137. cmd.Parameters.AddWithValue("@hallId", hallId);
  138. cmd.ExecuteNonQuery();
  139. }
  140. Console.WriteLine("Тренировка добавлена");
  141. }
  142. public void EditUser()
  143. {
  144. int userId;
  145. string phone;
  146. int remainingSessions;
  147. string validUntil;
  148. Console.Write("id пользователя для редактирования: ");
  149. userId = int.Parse(Console.ReadLine());
  150. Console.Write("Новый телефон: ");
  151. phone = Console.ReadLine();
  152. if (!IsValidPhone(phone))
  153. {
  154. Console.WriteLine("Ошибка: телефон должен содержать 11 цифр");
  155. return;
  156. }
  157. Console.Write("Новый остаток тренировок: ");
  158. remainingSessions = int.Parse(Console.ReadLine());
  159. Console.Write("Новая дата окончания (гггг-мм-дд): ");
  160. validUntil = Console.ReadLine();
  161. DateTime date;
  162. if (!DateTime.TryParse(validUntil, out date))
  163. {
  164. Console.WriteLine("Неверный формат даты");
  165. return;
  166. }
  167. string query = "update users_gym set phone = @phone, remaining_sessions = @remaining, valid_until = @validUntil where id = @id";
  168. using (var cmd = new NpgsqlCommand(query, conn))
  169. {
  170. cmd.Parameters.AddWithValue("@phone", phone);
  171. cmd.Parameters.AddWithValue("@remaining", remainingSessions);
  172. cmd.Parameters.AddWithValue("@validUntil", date);
  173. cmd.Parameters.AddWithValue("@id", userId);
  174. cmd.ExecuteNonQuery();
  175. }
  176. Console.WriteLine("Данные пользователя обновлены");
  177. }
  178. public void DeleteUser()
  179. {
  180. int userId;
  181. Console.Write("id пользователя для удаления: ");
  182. userId = int.Parse(Console.ReadLine());
  183. string query1 = "delete from training_session where user_id = @id";
  184. using (var cmd = new NpgsqlCommand(query1, conn))
  185. {
  186. cmd.Parameters.AddWithValue("@id", userId);
  187. cmd.ExecuteNonQuery();
  188. }
  189. string query2 = "delete from users_gym where id = @id";
  190. using (var cmd = new NpgsqlCommand(query2, conn))
  191. {
  192. cmd.Parameters.AddWithValue("@id", userId);
  193. cmd.ExecuteNonQuery();
  194. }
  195. Console.WriteLine("Пользователь удален");
  196. }
  197. public void SearchUsers()
  198. {
  199. string searchTerm;
  200. Console.Write("Введите фамилию для поиска: ");
  201. searchTerm = Console.ReadLine();
  202. string query = "select id, convert_from(users_name::bytea, 'UTF8') as users_name, convert_from(users_second_name::bytea, 'UTF8') as users_second_name, convert_from(users_last_name::bytea, 'UTF8') as users_last_name, phone, remaining_sessions, valid_until from users_gym where users_second_name ilike @search order by users_second_name";
  203. using (var cmd = new NpgsqlCommand(query, conn))
  204. {
  205. cmd.Parameters.AddWithValue("@search", "%" + searchTerm + "%");
  206. using (var reader = cmd.ExecuteReader())
  207. {
  208. if (!reader.HasRows)
  209. {
  210. Console.WriteLine("Ничего не найдено");
  211. return;
  212. }
  213. var results = new List<string[]>();
  214. while (reader.Read())
  215. {
  216. var row = new string[reader.FieldCount];
  217. Console.WriteLine($"\nid: {reader["id"]}");
  218. Console.WriteLine($"Имя: {reader["users_name"]}");
  219. Console.WriteLine($"Фамилия: {reader["users_second_name"]}");
  220. Console.WriteLine($"Отчество: {reader["users_last_name"]}");
  221. Console.WriteLine($"Телефон: {reader["phone"]}");
  222. Console.WriteLine($"Остаток тренировок: {reader["remaining_sessions"]}");
  223. Console.WriteLine($"Абонемент действует до: {reader["valid_until"]} \n");
  224. for (int i = 0; i < reader.FieldCount; i++)
  225. {
  226. row[i] = reader.GetValue(i).ToString();
  227. }
  228. results.Add(row);
  229. }
  230. Console.WriteLine($"Найдено {results.Count} записей");
  231. ExportToCsv(results);
  232. }
  233. }
  234. }
  235. public void ShowAllUsers()
  236. {
  237. string query = "select id, users_name, users_second_name, users_last_name, phone, remaining_sessions, valid_until from users_gym order by id";
  238. using (var cmd = new NpgsqlCommand(query, conn))
  239. using (var reader = cmd.ExecuteReader())
  240. {
  241. if (!reader.HasRows)
  242. {
  243. Console.WriteLine("Нет данных в таблице");
  244. return;
  245. }
  246. while (reader.Read())
  247. {
  248. Console.WriteLine($"\nid: {reader["id"]}");
  249. Console.WriteLine($"Имя: {reader["users_name"]}");
  250. Console.WriteLine($"Фамилия: {reader["users_second_name"]}");
  251. Console.WriteLine($"Отчество: {reader["users_last_name"]}");
  252. Console.WriteLine($"Телефон: {reader["phone"]}");
  253. Console.WriteLine($"Остаток тренировок: {reader["remaining_sessions"]}");
  254. Console.WriteLine($"Абонемент действует до: {reader["valid_until"]}\n");
  255. }
  256. }
  257. }
  258. private void ExportToCsv(List<string[]> data)
  259. {
  260. string filename = "export_" + DateTime.Now.Ticks + ".csv";
  261. using (var file = new StreamWriter(filename, false, Encoding.UTF8))
  262. {
  263. if (data.Count > 0)
  264. {
  265. for (int i = 0; i < data[0].Length; i++)
  266. {
  267. file.Write($"Column{i + 1}");
  268. if (i < data[0].Length - 1) file.Write(",");
  269. }
  270. file.WriteLine();
  271. foreach (var row in data)
  272. {
  273. for (int i = 0; i < row.Length; i++)
  274. {
  275. file.Write(row[i]);
  276. if (i < row.Length - 1) file.Write(",");
  277. }
  278. file.WriteLine();
  279. }
  280. }
  281. }
  282. Console.WriteLine("Файл сохранён в: " + Directory.GetCurrentDirectory());
  283. }
  284. public void ShowMenu()
  285. {
  286. int choice;
  287. while (true)
  288. {
  289. Console.WriteLine();
  290. Console.WriteLine("1. Показать всех пользователей");
  291. Console.WriteLine("2. Добавить пользователя");
  292. Console.WriteLine("3. Добавить тренировку");
  293. Console.WriteLine("4. Редактировать пользователя");
  294. Console.WriteLine("5. Удалить пользователя");
  295. Console.WriteLine("6. Поиск пользователей");
  296. Console.WriteLine("0. Выход");
  297. Console.Write("Выбор: ");
  298. if (!int.TryParse(Console.ReadLine(), out choice))
  299. {
  300. Console.WriteLine("Неверный выбор");
  301. continue;
  302. }
  303. switch (choice)
  304. {
  305. case 1:
  306. ShowAllUsers();
  307. break;
  308. case 2:
  309. AddUser();
  310. break;
  311. case 3:
  312. AddTraining();
  313. break;
  314. case 4:
  315. EditUser();
  316. break;
  317. case 5:
  318. DeleteUser();
  319. break;
  320. case 6:
  321. SearchUsers();
  322. break;
  323. case 0:
  324. return;
  325. default:
  326. Console.WriteLine("Неверный выбор");
  327. break;
  328. }
  329. }
  330. }
  331. static void Main()
  332. {
  333. Console.OutputEncoding = Encoding.UTF8;
  334. Console.WriteLine("Учёт тренировок спортсменов");
  335. TrainingDatabase db = new TrainingDatabase();
  336. db.ShowMenu();
  337. }
  338. }