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

时间:2017-12-09 10:17:22

标签: c# sql database connection-string rdbms

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

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

我读了以下问题:

How to get Database Name from Connection String using SqlConnectionStringBuilder

Extract properties of sql connection string

建议采用以下方法:

  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. 使用连接类:
    同样,我必须使用IDbConnection接口或DbConnection抽象类来构建这个跨RDBMS。我无法创建接口或抽象类的实例。我必须使用具体的类来实例化它,它再次成为RDBMS特定的。

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

  4. 我能想到的其他解决方法是使用一些强力逻辑,例如检查多个键(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的几种语法。

0 个答案:

没有答案