MdpDbConnectionError.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233
  1. namespace Admin.NET.Plugin.AiDOP.DataPlatform;
  2. /// <summary>
  3. /// 把数据库驱动异常转换为可操作且不泄露主机、账号、连接串的页面提示。
  4. /// </summary>
  5. internal static class MdpDbConnectionError
  6. {
  7. internal static (string Code, string Message) Describe(Exception exception)
  8. {
  9. var text = Flatten(exception);
  10. if (exception is MdpSourceSecretException || Contains(text, "SECRET_MISSING"))
  11. return ("SECRET_MISSING", "数据库口令未配置,请在数据源编辑页重新填写并保存");
  12. if (Contains(text, "Access denied", "Login failed", "authentication failed", "password authentication failed"))
  13. return ("AUTH_FAILED", "数据库账号、口令或来源地址授权不正确,请核对只读账号及应用服务器访问授权");
  14. if (Contains(text, "Unknown database", "Cannot open database", "database does not exist"))
  15. return ("DATABASE_NOT_FOUND", "目标数据库不存在或当前账号无权访问");
  16. if (exception is TimeoutException
  17. || Contains(text, "timed out", "timeout", "ETIMEDOUT", "Unable to connect", "actively refused", "Connection refused"))
  18. return ("CONNECTION_FAILED", "数据库网络连接失败,请检查主机、端口、防火墙和访问白名单");
  19. return ("CONNECTION_FAILED", "数据库连接失败,请检查连接配置并查看服务端日志");
  20. }
  21. private static string Flatten(Exception exception)
  22. {
  23. var messages = new List<string>();
  24. for (var current = exception; current != null; current = current.InnerException)
  25. messages.Add(current.Message);
  26. return string.Join(" | ", messages);
  27. }
  28. private static bool Contains(string text, params string[] values) =>
  29. values.Any(value => text.Contains(value, StringComparison.OrdinalIgnoreCase));
  30. }