如何从连接字符串中提取数据库名称而不管RDBMS?

我正在研究那个不了解正在使用的RDBMS的类。 当然,其余的应用程序都很清楚它。 连接字符串输入到此类。 我需要数据库名称。

如何从连接字符串中提取数据库名称而不管RDBMS?

我读了以下问题:

如何使用SqlConnectionStringBuilder从连接字符串获取数据库名称

提取sql连接字符串的属性

在那里建议采用以下方法:

  1. 使用连接字符串构建器类:
    大多数答案使用连接字符串构建器和特定的RDBMS。 所以,我必须使用SqlConnectionStringBuilderMySqlConnectionStringBuilder等。这是特定于RDBMS的。 为了实现这个跨RDBMS,我必须使用DbConnectionStringBuilder 。 以下是DbConnectionStringBuilder的代码:

     DbConnectionStringBuilder builder = new DbConnectionStringBuilder(); builder.ConnectionString = connectionString; string databaseName = builder["Initial Catalog"] as string; 

    这种方法的问题是使用的关键"Initial Catalog" 。 由于连接字符串的语法对于每个RDBMS是不同的,因此其他RDBMS的连接字符串可能不包含密钥,并且代码不起作用。
    例如,上面的代码不适用于跟随有效的MySql连接字符串,因为它不包含密钥。

     Server=MyServer;Database=MyDB;User ID=MyUser;Password=MyPassword; 
  2. 使用Connection类:
    同样,我必须使用IDbConnection接口或DbConnection抽象类来构建这个跨RDBMS。 我无法创建接口或抽象类的实例。 我必须使用具体类来实例化它,它再次成为特定于RDBMS的。

  3. 字符串处理:
    使用C#或正则表达式或类似的字符串处理function解析字符串。 正如我之前所说,连接字符串的语法因RDBMS而异,但这不起作用。

我能想到的其他解决方法是使用一些powershell逻辑,例如检查多个键( Initial Catalog, Database等)而不是一个。 如果可能,我想避免这种情况。 这可能是无穷无尽的条件,因此不是一种可靠的方式。 如果这只是要走的路,请建议可能的密钥来检查那些覆盖所有RDBMS的连接字符串的所有可能语法。

注意:
当我说“跨RDBMS”或“所有RDBMS”时,我实际上并不是指“地球上的所有RDBMS”。 解决方案应涵盖至少三个RDBMS(SQL Server,My SQL,Oracle)及其多个变体/版本/引擎。

编辑1:

要解决上面提到的连接字符串构建器解决方案的问题,我在下面尝试过:

 DbConnectionStringBuilder builder = new DbConnectionStringBuilder(); builder.ConnectionString = connectionString; object dbName = null; bool dbNameFound = false; dbNameFound = builder.TryGetValue("Initial Catalog", out dbName); if(dbNameFound == false) dbNameFound = builder.TryGetValue("Database", out dbName); if(dbNameFound == false) throw new Exception("Failed to extract database name from connection string."); string databaseName = Convert.ToString(dbName); 

此代码仍然不适用于Oracle的少量语法。