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:我所说的“设置值”只是将提供的值分配给类级属性。我用一个例子更新了答案中的代码。