Como obter o nome do banco de dados da string de conexão usando SqlConnectionStringBuilder

87

Nunca quero dividir a string de conexão usando a manipulação de string e obter servidor, banco de dados, uid e senha.

Eu li o link a seguir e li a resposta aceita, descobri que é a melhor maneira de obter o ID do usuário e a senha da string de conexão, mas e o Nome do Banco de Dados?

Maneira certa de obter o nome de usuário e a senha da string de conexão?

Como obter o nome do banco de dados da string de conexão usando SqlConnectionStringBuilder. (o DataSource é o nome do servidor?)

Imran Rizvi
fonte

Respostas:

146

Você pode usar a classe ConnectionStringBuilder específica do provedor (dentro do namespace apropriado) ou System.Data.Common.DbConnectionStringBuilderpara abstrair o objeto da string de conexão, se necessário. Você precisaria saber as palavras-chave específicas do provedor usadas para designar as informações que está procurando, mas para um exemplo do SQL Server, você poderia fazer uma destas duas coisas:

System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder(connectionString);

string server = builder.DataSource;
string database = builder.InitialCatalog;

ou

System.Data.Common.DbConnectionStringBuilder builder = new System.Data.Common.DbConnectionStringBuilder();

builder.ConnectionString = connectionString;

string server = builder["Data Source"] as string;
string database = builder["Initial Catalog"] as string;
Romil Kumar Jain
fonte
2
Para mim, a última linha precisava ser: string database = builder["Initial Catalog"] as string;- "Banco de dados" era uma palavra-chave inválida.
Sandra
@Sandra sim, você está correto. builder ["Database"] como string funcionará se usarmos SqlConnectionStringBuilder.
Romil Kumar Jain
30

Uma alternativa muito mais simples é obter as informações do próprio objeto de conexão. Por exemplo:

IDbConnection connection = new SqlConnection(connectionString);
var dbName = connection.Database;

Da mesma forma, você também pode obter o nome do servidor do objeto de conexão.

DbConnection connection = new SqlConnection(connectionString);
var server = connection.DataSource;
Nawfal
fonte
Isso é o que eu estava procurando. Obrigado.
Ivan Santiago
Isso se torna específico para SqlConnection. Existe alguma maneira semelhante de fazer este RDBMS cruzado?
Amit Joshi
@AmitJoshi Não deveriam todos implementar IDbConnection?
nawfal
@nawfal: Concordo, mas isso ainda não o torna utilizável. Eu expliquei isso em detalhes nesta pergunta. stackoverflow.com/q/47727524/5779732
Amit Joshi
Ele pode obter o banco de dados e a fonte de dados, mas não conseguiu obter o userId e a senha dessa forma.
Dush
11
string connectString = "Data Source=(local);" + "Integrated Security=true";

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectString);

Console.WriteLine("builder.InitialCatalog = " + builder.InitialCatalog);
Kishore Kumar
fonte
7

isso dá a você o Xact;

System.Data.SqlClient.SqlConnectionStringBuilder connBuilder = new System.Data.SqlClient.SqlConnectionStringBuilder();

connBuilder.ConnectionString = connectionString;

string server = connBuilder.DataSource;           //-> this gives you the Server name.
string database = connBuilder.InitialCatalog;     //-> this gives you the Db name.
pvaju896
fonte
4

Você pode usar a propriedade InitialCatalog ou builder["Database"]funciona também. Eu testei com um caso diferente e ainda funciona.

Habib
fonte