C# 更改SqlConnection字符串并在运行时调用SqlConnectionStringBuilder
我的表单中有一个SqlConnection,在初始化表单时,我调用它,如下所示: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
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 ;
}