我正在研究那个不了解正在使用的RDBMS的类。当然,其余的应用程序都很清楚它。连接字符串输入到此类。我需要数据库名称。
如何从连接字符串中提取数据库名称而不管RDBMS?
我读了以下问题:
How to get Database Name from Connection String using SqlConnectionStringBuilder
Extract properties of sql connection string
建议采用以下方法:
使用连接字符串构建器类:
大多数答案使用连接字符串构建器和特定的RDBMS。所以,我必须使用SqlConnectionStringBuilder
或MySqlConnectionStringBuilder
等。这是特定于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;
使用连接类:
同样,我必须使用IDbConnection
接口或DbConnection
抽象类来构建这个跨RDBMS。我无法创建接口或抽象类的实例。我必须使用具体的类来实例化它,它再次成为RDBMS特定的。
字符串处理:
使用C#或正则表达式或类似的字符串处理功能解析字符串。正如我之前所说,连接字符串的语法因RDBMS而异,但这不起作用。
我能想到的其他解决方法是使用一些强力逻辑,例如检查多个键(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的几种语法。