Db.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System.Data;
  2. using Npgsql;
  3. using TravelAgencyWinForms.Models;
  4. namespace TravelAgencyWinForms.Data;
  5. public static class Db
  6. {
  7. private const string DefaultConnectionString = "Host=edu-pg.itiscaf.ru;Port=5432;Database=dbwork;Username=shchetnikov_id;Password=#10j$bn0&22;Search Path=shchetnikov_id;Include Error Detail=true";
  8. public static string ConnectionString
  9. {
  10. get
  11. {
  12. var localPath = Path.Combine(AppContext.BaseDirectory, "connection.txt");
  13. if (File.Exists(localPath))
  14. {
  15. var text = File.ReadAllText(localPath).Trim();
  16. if (!string.IsNullOrWhiteSpace(text))
  17. return text;
  18. }
  19. return DefaultConnectionString;
  20. }
  21. }
  22. public static NpgsqlConnection CreateConnection()
  23. {
  24. return new NpgsqlConnection(ConnectionString);
  25. }
  26. public static DataTable Query(string sql, params NpgsqlParameter[] parameters)
  27. {
  28. using var connection = CreateConnection();
  29. using var command = new NpgsqlCommand(sql, connection);
  30. if (parameters.Length > 0)
  31. command.Parameters.AddRange(parameters);
  32. using var adapter = new NpgsqlDataAdapter(command);
  33. var table = new DataTable();
  34. adapter.Fill(table);
  35. return table;
  36. }
  37. public static int Execute(string sql, params NpgsqlParameter[] parameters)
  38. {
  39. using var connection = CreateConnection();
  40. connection.Open();
  41. ApplyAppContext(connection);
  42. using var command = new NpgsqlCommand(sql, connection);
  43. if (parameters.Length > 0)
  44. command.Parameters.AddRange(parameters);
  45. return command.ExecuteNonQuery();
  46. }
  47. public static object? Scalar(string sql, params NpgsqlParameter[] parameters)
  48. {
  49. using var connection = CreateConnection();
  50. connection.Open();
  51. using var command = new NpgsqlCommand(sql, connection);
  52. if (parameters.Length > 0)
  53. command.Parameters.AddRange(parameters);
  54. var value = command.ExecuteScalar();
  55. return value == DBNull.Value ? null : value;
  56. }
  57. public static void ResetIdentitySequences()
  58. {
  59. try
  60. {
  61. Execute("CALL sp_reset_identity_sequences();");
  62. }
  63. catch
  64. {
  65. }
  66. }
  67. public static bool TestConnection(out string message)
  68. {
  69. try
  70. {
  71. using var connection = CreateConnection();
  72. connection.Open();
  73. using var command = new NpgsqlCommand("select current_database(), current_schema();", connection);
  74. using var reader = command.ExecuteReader();
  75. if (reader.Read())
  76. message = $"Подключение выполнено. База: {reader.GetString(0)}, схема: {reader.GetString(1)}";
  77. else
  78. message = "Подключение выполнено.";
  79. return true;
  80. }
  81. catch (Exception ex)
  82. {
  83. message = ex.Message;
  84. return false;
  85. }
  86. }
  87. public static void SetAppContext(string login)
  88. {
  89. try
  90. {
  91. using var connection = CreateConnection();
  92. connection.Open();
  93. using var command = new NpgsqlCommand("CALL sp_set_app_context(@login);", connection);
  94. command.Parameters.AddWithValue("login", login);
  95. command.ExecuteNonQuery();
  96. }
  97. catch
  98. {
  99. }
  100. }
  101. public static void ApplyAppContext(NpgsqlConnection connection)
  102. {
  103. if (string.IsNullOrWhiteSpace(CurrentUser.Login))
  104. return;
  105. try
  106. {
  107. using var command = new NpgsqlCommand("CALL sp_set_app_context(@login);", connection);
  108. command.Parameters.AddWithValue("login", CurrentUser.Login);
  109. command.ExecuteNonQuery();
  110. }
  111. catch
  112. {
  113. }
  114. }
  115. }