C# 更改SqlConnection字符串并在运行时调用SqlConnectionStringBuilder

C# 更改SqlConnection字符串并在运行时调用SqlConnectionStringBuilder,c#,sql-server,sqlconnection,C#,Sql Server,Sqlconnection,我的表单中有一个SqlConnection,在初始化表单时,我调用它,如下所示: public partial class options : Form { SqlConnection conn = new SqlConnection(myConnection.DataSource.ConnectionString); 这就是课堂上的情况: public class myConnection { internal static class DataSourc

我的表单中有一个SqlConnection,在初始化表单时,我调用它,如下所示:

 public partial class options : Form
    {
        SqlConnection conn = new SqlConnection(myConnection.DataSource.ConnectionString);
这就是课堂上的情况:

public class myConnection
{

    internal static class DataSource
    {
        private static string _ConnectionString;
        public static string ConnectionString
        {
            get
            {
                if (_ConnectionString == null)
                    _ConnectionString = FunctionToDynamicallyCreateConnectionstring();
                return _ConnectionString;
            }
        }
        private static string FunctionToDynamicallyCreateConnectionstring()
        {
                    SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder();

                    cb.DataSource = Properties.Settings.Default.sql;
                    cb.InitialCatalog = Properties.Settings.Default.database;
                    cb.UserID = Properties.Settings.Default.user;
                    cb.Password = Properties.Settings.Default.pass;
                    cb.MultipleActiveResultSets = true;

                    cb.ConnectTimeout = 20;

                     return cb.ToString();

        }}
在我的项目的选项窗体中,我在单击按钮时执行此操作,该按钮会更改特定字符串的设置。设置值稍后将用于SqlConnectionStringBuilder

当我完成更改后,我关闭表单,并在表单1中的FormClosed事件上执行此操作,该事件是从表单中引发的选项

conn = new SqlConnection(myConnection.DataSource.ConnectionString);
我认为它会根据Properties.Settings.Default.pass等字符串中的实际值更改连接字符串。但事实并非如此

所以我的问题是,是否有可能以某种方式更改已经初始化的SqlConnection的字符串


提前感谢各位抽出时间。

不。您必须关闭SqlConnection并打开一个新连接

根据报告:

只能在连接关闭时设置ConnectionString属性。许多连接字符串值具有相应的只读属性。设置连接字符串后,将更新这些属性,除非检测到错误。在这种情况下,不会更新任何属性。SqlConnection属性仅返回ConnectionString中包含的设置

注意这一点,因为它会重置许多连接属性:

在关闭的连接上重置ConnectionString会重置所有连接字符串值和相关属性,包括密码。例如,如果设置一个包含Database=AdventureWorks的连接字符串,然后将该连接字符串重置为Data Source=myserver;Integrated Security=true,数据库属性不再设置为AdventureWorks


不可以。您必须关闭SqlConnection并打开一个新连接

根据报告:

只能在连接关闭时设置ConnectionString属性。许多连接字符串值具有相应的只读属性。设置连接字符串后,将更新这些属性,除非检测到错误。在这种情况下,不会更新任何属性。SqlConnection属性仅返回ConnectionString中包含的设置

注意这一点,因为它会重置许多连接属性:

在关闭的连接上重置ConnectionString会重置所有连接字符串值和相关属性,包括密码。例如,如果设置一个包含Database=AdventureWorks的连接字符串,然后将该连接字符串重置为Data Source=myserver;Integrated Security=true,数据库属性不再设置为AdventureWorks

您的ConnectionString仅初始化一次,因为您这样做了:

public static string ConnectionString
{
    get
    {
        if (_ConnectionString == null)
            _ConnectionString = FunctionToDynamicallyCreateConnectionstring();
        return _ConnectionString;
    }
}
属性调用一次后,将使用记录的值,并且永远不允许更改

你需要一个重置方法

public void ResetConnectionParams()
{
    _ConnectionString = null;
}
这样,下次调用属性时,就可以使用新值重新生成参数。这意味着您的新连接将使用新的、修改过的连接字符串创建。确保在某个地方调用此新方法

您的ConnectionString只初始化了一次,因为您这样做了:

public static string ConnectionString
{
    get
    {
        if (_ConnectionString == null)
            _ConnectionString = FunctionToDynamicallyCreateConnectionstring();
        return _ConnectionString;
    }
}
属性调用一次后,将使用记录的值,并且永远不允许更改

你需要一个重置方法

public void ResetConnectionParams()
{
    _ConnectionString = null;
}

这样,下次调用属性时,就可以使用新值重新生成参数。这意味着您的新连接将使用新的、修改过的连接字符串创建。确保在某个地方调用此新方法

只能通过构造函数设置SqlConnection的连接字符串,或者对于现有实例,如果SqlConnection处于关闭状态,更改打开连接的连接字符串意味着什么

如果SqlConnection已关闭,则可以在SqlConnection实例上设置ConnectionString设置ConnectionString属性:

conn.ConnectionString = @"your-connection-string-here" ;
然而。。。默认情况下,sql连接根据用于构造连接的确切连接字符串进行池缓存。如果您的应用程序域是长期存在的,那么如果您要打开任意连接,您可能需要更改连接池配置,以免留下打开的连接

这也意味着一种常见的模式是为每个查询构造一个新的连接,打开和关闭它的时间越短越好,如下所示:

public int ExecuteSomeStoredProcudure( out DataTable dataTable )
{
    int rc ;
    string connectionString = GetConnectionString() ;
    using ( SqlConnection conn = new SqlConnection(connectionString))
    using ( SqlCommand cmd = conn.CreateCommand() )
    using ( SqlDataAdapter sda = new SqlDataAdapter())
    {
        cmd.CommandText = "someStoredProcedure" ;
        cmd.CommandType = CommandType.StoredProcedure;
        conn.Open() ;
        dataTable = new DataTable();
        rc = sda.Fill(dataTable) ;
        conn.Close() ;
    }
    return rc ;
}

SqlConnection的连接字符串只能通过构造函数设置,或者对于现有实例,如果SqlConnection处于关闭状态,更改打开连接的连接字符串意味着什么

如果SqlConnection已关闭,则可以在SqlConnection实例上设置ConnectionString设置ConnectionString属性:

conn.ConnectionString = @"your-connection-string-here" ;
然而。。。默认情况下,sql连接由ca池化 基于用于构造连接的确切连接字符串。如果您的应用程序域是长期存在的,那么如果您要打开任意连接,您可能需要更改连接池配置,以免留下打开的连接

这也意味着一种常见的模式是为每个查询构造一个新的连接,打开和关闭它的时间越短越好,如下所示:

public int ExecuteSomeStoredProcudure( out DataTable dataTable )
{
    int rc ;
    string connectionString = GetConnectionString() ;
    using ( SqlConnection conn = new SqlConnection(connectionString))
    using ( SqlCommand cmd = conn.CreateCommand() )
    using ( SqlDataAdapter sda = new SqlDataAdapter())
    {
        cmd.CommandText = "someStoredProcedure" ;
        cmd.CommandType = CommandType.StoredProcedure;
        conn.Open() ;
        dataTable = new DataTable();
        rc = sda.Fill(dataTable) ;
        conn.Close() ;
    }
    return rc ;
}