C# 如何动态更改ConnectionString类

C# 如何动态更改ConnectionString类,c#,winforms,C#,Winforms,在我的项目中,我使用了一个ConnectionString类。我想在Winforms应用程序中动态更改我的ConnectionString类 我想创建一个表单(frmServerCon),在这里我可以在文本框中输入新值,如数据源,初始目录,用户名和密码。当我单击“保存”按钮时,代码应将这些新设置保存在ConnectionString类中,并在“连接”按钮上单击,在保存之前应检查新连接值是否适用于SQL Server 现在,我的ConnectionString类如下所示: using System

在我的项目中,我使用了一个
ConnectionString
类。我想在Winforms应用程序中动态更改我的
ConnectionString

我想创建一个表单(
frmServerCon
),在这里我可以在文本框中输入新值,如数据源初始目录用户名密码。当我单击“保存”按钮时,代码应将这些新设置保存在
ConnectionString
类中,并在“连接”按钮上单击,在保存之前应检查新连接值是否适用于SQL Server

现在,我的
ConnectionString
类如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 7KProject
{
    class ConnectionString
    {
        public string DBConn = "Data Source=TCP/IP,PORT;Initial Catalog=DataBase;User ID=user;Password=*******";

    }
}
public class ConnectionString
{
    public string DataSource { get; set; }
    public string InitialCatalog { get; set; }
    public string UserID { get; set; }
    public string Password { get; set; }

    public ConnectionString(string dataSource, string initialCatalog, string userID, string password)
    {
        DataSource = dataSource;
        InitialCatalog = initialCatalog;
        // etc.
    }

    public override string ToString()
    {
        return string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", DataSource, InitialCatalog, UserID, Password);
    }
}
我找不到任何解决办法。如果您能帮助编写一些工作代码,那就太好了。对不起,我没有示例代码


谢谢。

我不建议您按照现在的方式来做,但是要在代码的基础上构建,您应该在类中使用属性而不是字段

因此,通过以下方式更新您的类:

public class ConnectionString
{
    public string DBConn { get; set; } = "your default string here";
}
然后在代码中的其他地方,您可以像这样获取或设置属性

var connectionString = new ConnectionString();
var dbConn = connectionString.DBConn; // get the value
connectionString.DBConn = "new string"; // set it with a new value

如果要单独编辑这些值,请单独存储它们。大概是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 7KProject
{
    class ConnectionString
    {
        public string DBConn = "Data Source=TCP/IP,PORT;Initial Catalog=DataBase;User ID=user;Password=*******";

    }
}
public class ConnectionString
{
    public string DataSource { get; set; }
    public string InitialCatalog { get; set; }
    public string UserID { get; set; }
    public string Password { get; set; }

    public ConnectionString(string dataSource, string initialCatalog, string userID, string password)
    {
        DataSource = dataSource;
        InitialCatalog = initialCatalog;
        // etc.
    }

    public override string ToString()
    {
        return string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", DataSource, InitialCatalog, UserID, Password);
    }
}
然后,您可以使用所需的值创建一个
ConnectionString
对象,并根据需要修改这些值,并且在任何时候需要从该对象生成连接字符串,您只需在该对象的实例上调用
.ToString()


基本上,每当您有一个包含多个值的字符串时,请抵制修改字符串以操纵这些值的诱惑。如果有单独的值,那么就有单独的变量。把事情分开。仅在需要时生成结果字符串。

创建配置文件以存储数据库凭据。当应用程序启动时,读取凭据并生成连接字符串。存储它并用于创建dbContext。使用表单更改配置文件。

您可以创建用户字符串设置:

属性>设置:

Name          Type    Scope  Value
MyConnection  string  User   Data Source=TCP/IP,PORT;Initial Catalog=DataBase;User ID=user;Password=*******"
阅读使用:

string MyConn = Properties.Settings.Default.MyConnection;
Properties.Settings.Default.MyConnection = "...";
Properties.Settings.Default.Save();
并使用以下方法保存:

string MyConn = Properties.Settings.Default.MyConnection;
Properties.Settings.Default.MyConnection = "...";
Properties.Settings.Default.Save();

不幸的是,(ConnectionString)类型是应用程序范围(只读),因此请改用用户范围的“string”。另外,如果要存储密码,最好对该字符串进行加密/解密。

我建议使用NuGet包。这对我很有效。

我已经用另一种方法解决了这个问题。我希望它可以帮助其他人寻找这个,我想请审查它,如果有任何改进,请确实建议

我正在调用app.config connectionString

<connectionStrings>
    <add name="DBConn" connectionString="Data Source=Servername;Network Library = DBMSSOCN;Initial Catalog=database;User ID=user;Password=password" providerName="System.Data.SqlClient"/>
  </connectionStrings>
在后端,我创建了一个表单来添加新的服务器连接信息,以向app.config connectionString添加新值。SvrConfig表单

using System;
using System.Windows.Forms;
using System.Configuration;
using System.Reflection;

namespace B4_HRM_System
{
    public partial class SvrConfig : Form
    {
        public SvrConfig()
        {
            InitializeComponent();
        }

        private void btnsave_Click(object sender, EventArgs e)
        {
            try

            {

                if (txtserver.Text == "")
                {
                    MessageBox.Show("Please enter Server Name.", "7KProject", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtserver.Focus();
                    return;
                }



                if (txtdb.Text == "")
                {
                    MessageBox.Show("Please enter Database.", "7KProject", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtdb.Focus();
                    return;
                }

                if (txtuser.Text == "")
                {
                    MessageBox.Show("Please enter Username.", "7KProject", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtuser.Focus();
                    return;
                }



                if (txtpass.Text == "")
                {
                    MessageBox.Show("Please enter Password.", "7KProject", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtpass.Focus();
                    return;
                }

                string DBConn = "Data Source={0};Initial Catalog={1};User ID={2};Password={3}";
                DBConn = string.Format(DBConn, txtserver.Text, txtdb.Text, txtuser.Text, txtpass.Text);
                Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
                ConnectionStringsSection connSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
                connSection.ConnectionStrings["DBConn"].ConnectionString = DBConn;
                config.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("AppSettings");
                MessageBox.Show("Successfully Completed", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message, ex.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }

        private void btnexit_Click(object sender, EventArgs e)
        {
            this.Hide();
            b4login frmb4login = new b4login();
            frmb4login.Show();
       }

        }
}

但每次保存connectionString时,我都必须重新启动应用程序。当我在显示登录表单之前关闭SvrConfig表单,更新/刷新app.config文件中的连接字符串,这样我就不必重新启动应用程序时,是否有任何方法或改进SvrConfig表单。

不要重新发明轮子(再一次!)-已经有了一个类似于你所尝试的方法,大卫,我仍然是一个noob,你能告诉我在这里设置值时应该使用什么吗。以及我如何用表格解决这个问题。我正在寻找类和窗体的示例代码。@Bukhalifa:我所说的“设置值”只是将提供的值分配给类级属性。我用一个例子更新了答案中的代码。