#c# #connection-string #app-config
#c# #строка подключения #app-config
Вопрос:
Как я могу получить пользователя и пароль из такой строки подключения в app.config с помощью функции .NET?
Конечно, я мог бы прочитать эту строку и получить значение после ID= и Password= .
<connectionStrings>
<add name="MyConString" connectionString="Data Source=(local);Initial Catalog=MyDatabase;Persist Security Info=True;User ID=MyUsername Password=MyPassword;Connect providerName="System.Data.SqlClient"/>
</connectionStrings>
Комментарии:
1. Надеюсь, вы заметили, что вам не хватает ‘;» после «MyUsername» — перед «Password»
Ответ №1:
используйте класс connectionbuilder
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder("Your connection string");
string password = builder.Password;
вместе с
string connString = ConfigurationManager.ConnectionStrings["MyConString"].ConnectionString;
для достижения этой цели.
Ответ №2:
SqlConnectionStringBuilder con = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
string myUser = con.UserID;
string myPass = con.Password;
Ответ №3:
Если вам нужен более общий подход для анализа строки подключения (который не учитывает специфику одного поставщика базы данных), вы также можете использовать
System.Data.Обычный.DbConnectionStringBuilder
который является базовым классом для других классов, таких как SqlConnectionStringBuilder и т.д.
Вы можете создать экземпляр DbConnectionStringBuilder, и в моем случае мне нужно было иметь одну настраиваемую строку подключения, из которой я мог бы получать информацию — независимо от типа поставщика базы данных. Несколько вариантов, если вам нужна такая гибкость — вы можете создать соответствующий ConnectionStringBuilder для вашего провайдера, как предлагали другие — это, вероятно, потребуется в большинстве случаев, когда требуются свойства, зависящие от поставщика.
Или, если вы хотите прочитать только пару общих свойств, вы можете использовать DbConnectionStringBuilder, если вам просто нужны идентификатор пользователя и пароль, например.
Этот пример должен работать для ЛЮБОЙ строки подключения, которая включает идентификатор пользователя и пароль.
DbConnectionStringBuilder db = new DbConnectionStringBuilder();
db.ConnectionString = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
var username = db["User Id"].ToString();
var password = db["Password"].ToString();
Ответ №4:
var builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MyConString"].ConnectionString)
var user = builder.UserID;
var password = builder.Password;
Ответ №5:
Вы можете получить строку подключения из следующего
SqlConnectionStringBuilder yourconn = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
string password = yourconn.Password;
Затем вы можете получить искомую подстроку.
Ответ №6:
Просто чтобы добавить немного к ответу Томаса Валека.
Этот подход будет работать, только если «Идентификатор пользователя» в строке подключения правильно прописан. Поставщик Oracle принял «Идентификатор пользователя» нормально, но SqlConnectionStringBuilder
не сработал.
public static class DbConnectionFactory
{
public static ConnectionStringSettings AppConnectionSettings = ConfigurationManager.ConnectionStrings["{A connection string name}"];
public static SqlConnectionStringBuilder AppConnBuilder = new SqlConnectionStringBuilder(AppConnectionSettings.ConnectionString);
public static string DbUserID
{
get
{
return AppConnBuilder.UserID;
}
set { }
}
}
Ответ №7:
добавьте ссылку на System.Настройка, а затем использование: использование системы.Конфигурация;
string MyDBConnection = ConfigurationManager.ConnectionStrings["MyDBConnection"].ConnectionString;
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(MyDBConnection);
string UserID = builder.UserID;
string Password = builder.Password;
string ServerName = builder.DataSource;
string DatabaseName = builder.InitialCatalog;
Ответ №8:
public static string GetConnectionSettings(string searchSetting )
{
var con = ConfigurationManager.ConnectionStrings["yourConnectionHere"].ConnectionString;
String[] myString = con.Split(';');
Dictionary<string, string> dict = new Dictionary<string, string>();
for (int i = 0; i < myString.Count(); i )
{
String[] con3 = myString[i].Split('='); dict.Add(con3[0], con3[1]);
}
return dict[searchSetting];
}
для настройки поиска вы можете использовать то, что вы хотите, «Пользователь есть» или пароль.
Комментарии:
1. общедоступная статическая строка GetConnectionSettings(строка searchSetting ) { var con = ConfigurationManager . ConnectionStrings[«yourConnectionHere»]. Строка подключения; Строка[] myString = con. Split(‘;’); Dictionary<строка, строка> dict = новый словарь<строка, строка>(); for (int i = 0; i < myString . Count(); i ) { String[] con3 = myString[i].Split(‘=’); dict. Добавить(con3[0], con3[1]); } вернуть dict[searchSetting]; }
Ответ №9:
другой способ — использовать регулярное выражение (что я и сделал) с более щадящим шаблоном для обработки различных способов указания идентификатора пользователя в строке подключения:
public static string GetUserIdFromConnectionString(string connectionString)
{
return new Regex("USER\s ID\=\s*?(?<UserId>\w )",
RegexOptions.IgnoreCase)
.Match(connectionString)
.Groups["UserId"]
?.Value;
}
Ответ №10:
Метод расширения для получения «идентификатора пользователя» из ConnectionString в DbConnection:
using System;
using System.Data.Common;
using System.Text.RegularExpressions;
namespace DemoProject.Helpers
{
public static class DbConnectionExtensions
{
public static string GetUserId(this DbConnection connection)
{
const string userIdPattern1 = "User[ ]*Id";
const string userIdPattern2 = "UID";
var connectionString = connection.ConnectionString;
foreach (var item in connectionString.Split(';'))
{
var index = item.IndexOf('=');
if (index == -1)
continue;
var property = item.Substring(0, index).Trim();
if (Regex.IsMatch(property, userIdPattern1, RegexOptions.IgnoreCase) ||
Regex.IsMatch(property, userIdPattern2, RegexOptions.IgnoreCase))
{
var userId = item.Substring(index 1).Trim();
return userId;
}
}
throw new Exception("Couldn't find "User Id" in connectionString");
}
}
}
Пример #1 использования:
using DemoProject.Helpers;
using Oracle.ManagedDataAccess.Client;
namespace DemoProject
{
class Program
{
static void Main(string[] args)
{
const string connectionString = "Data Source=(DESCRIPTION="
"(ADDRESS=(PROTOCOL=TCP)(HOST=oracle19c-vm)(PORT=1521))"
"(CONNECT_DATA=(SERVICE_NAME=ORCLPDB1)));"
"User Id=JOHN;"
"Password=pwd123";
var connection = new OracleConnection(connectionString);
var userId = connection.GetUserId();
}
}
}
Пример #2 использования:
using DemoProject.Helpers;
using Npgsql;
namespace DemoProject
{
class Program
{
static void Main(string[] args)
{
const string connectionString = "Server=postgre-vm;"
"User Id=JOHN;"
"Password=pwd123;"
"Database=DEV1";
var connection = new NpgsqlConnection(connectionString);
var userId = connection.GetUserId();
}
}
}
Также вы можете добавить 2-й метод расширения для получения пароля
Ответ №11:
var connString = ConfigurationManager.ConnectionStrings["MyConString"].ConnectionString;
var tokens = connString.Split(';');
string userId;
string password;
for(var i = 0; i < tokens.Length; i ) {
var token = tokens[i];
if(token.StartsWith("User ID"))
userId = token.Substring(token.IndexOf("=") 1);
if(token.StartsWith("Password"))
password = token.Substring(token.IndexOf("=") 1);
}
Комментарии:
1. 1 для примера кода. Однако не следует
token.Substring(token.IndexOf("=") 1);
ли убрать «=»?2. @Tim: Спасибо. Отмечено и отредактировано — разговор о том, что один за другим всегда поднимает свою уродливую голову 🙂
Ответ №12:
string connectionString = ConfigurationManager.ConnectionStrings["MyConString"].ConnectionString;
var tokens = connectionString.Split(';').Select(n => n.Split('=');
string userId = tokens.First(n => n[0].Equals("User ID").Select(n => n[1]);
string password = tokens.First(n => n[0].Equals("Password").Select(n => n[1]);