Можно ли программно изменить имя пользователя / пароль внутри строки подключения внутри App.config? - PullRequest
0 голосов
/ 02 ноября 2018
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="connect_cbu" connectionString="Data Source=192.168.66.67; Initial Catalog=CBU; Persist Security Info=True; User ID=Admin;Password=1234"/>   
  </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
</configuration>

Допустим, я определил следующие две строки: public static string user; и public static string pass; внутри Global.cs. Можно ли как-то включить их в connectionString?

Пример:

connectionString="Data Source=192.168.66.67; Initial Catalog=CBU; Persist Security Info=True; User ID='Global.user';Password='Global.pass'"/>

Решение, основанное на ответе TheGeneral:

app.config

<connectionStrings>
<clear/>
<add name="connect_cbu" connectionString="Data Source=192.168.66.67; Initial Catalog=CBU; Persist Security Info=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

MainWindow.xaml.cs

using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Windows;


namespace Test
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            OpenConnection();
            InitializeComponent();
        }

        public SqlConnection con = new SqlConnection();

        public void OpenConnection()
        {
            try
            {
                con.ConnectionString = BuildConnectionString("Admin", "1234"); 
                con.Open();
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message, "Warning", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            MessageBoxResult result = MessageBox.Show(this, "Do you want to exit?", "Warning", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
            if (result != MessageBoxResult.Yes)
            {
                e.Cancel = true;
                con.Close();
            }
        }

        public static string BuildConnectionString(string userName, string userPassword)
        {
            ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["connect_cbu"];

            if (null != settings)
            {
                string connectString = settings.ConnectionString;
                Console.WriteLine("Original: {0}", connectString);
                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectString)
                {
                    UserID = userName,
                    Password = userPassword
                };
                Console.WriteLine("Modified: {0}", builder.ConnectionString);
                return builder.ToString();
            }
            else
            {
                MessageBox.Show("App.config is missing!", "Warning", MessageBoxButton.OK, MessageBoxImage.Error);
                return "fail";
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

App.Config является частью программного обеспечения в папке Program Files , которую нельзя изменять после установки.

Вы также не должны писать там имя пользователя / пароль. Это было бы доступно для любого, чтобы читать.

Используйте ConnectionStringBuilder и храните имя пользователя / пароль в безопасном месте.

Или, может быть, если это БД MSSQL, вы можете использовать Integrated Security . Таким образом, безопасность доступа к БД может быть обработана вне вашего программного обеспечения.

0 голосов
/ 02 ноября 2018

Есть определенные компоновщики строк подключения , которые, вероятно, будут полезны для вас

Если определенные элементы строки соединения известны заранее, они может быть сохранен в файле конфигурации и извлечен во время выполнения построить полную строку подключения. Например, название База данных может быть известна заранее, но не имя сервера. Или же вы можете захотеть, чтобы пользователь вводил имя и пароль во время выполнения не имея возможности вводить другие значения в строку подключения.

Eg

<connectionStrings>  
  <clear/>  
  <add name="partialConnectString"   
    connectionString="Initial Catalog=Northwind;"  
    providerName="System.Data.SqlClient" />  
</connectionStrings>  

Пример

private static void BuildConnectionString(string dataSource,
    string userName, string userPassword)
{
    // Retrieve the partial connection string named databaseConnection
    // from the application's app.config or web.config file.
    ConnectionStringSettings settings =
        ConfigurationManager.ConnectionStrings["partialConnectString"];

    if (null != settings)
    {
        // Retrieve the partial connection string.
        string connectString = settings.ConnectionString;
        Console.WriteLine("Original: {0}", connectString);

        // Create a new SqlConnectionStringBuilder based on the
        // partial connection string retrieved from the config file.
        SqlConnectionStringBuilder builder =
            new SqlConnectionStringBuilder(connectString);

        // Supply the additional values.
        builder.DataSource = dataSource;
        builder.UserID = userName;
        builder.Password = userPassword;
        Console.WriteLine("Modified: {0}", builder.ConnectionString);
    }
}

но как мне инициализировать BuildConnectionString?

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(youCurrrentConnectionString);

builder.UserID = userName;
builder.Password = userPassword;


//usage 
ConnectionString = builder.ConnectionString;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...