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