我的表单中有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();
}}
在我的项目的“选项”表单中,我在button click
上执行此操作,这会更改特定字符串的Settings.Settings
值,这些值稍后用于SqlConnectionStringBuilder
Properties.Settings.Default.sql = sql.Text;
Properties.Settings.Default.Save();
Properties.Settings.Default.database = database.Text;
Properties.Settings.Default.Save();
Properties.Settings.Default.user = user.Text;
Properties.Settings.Default.Save();
Properties.Settings.Default.pass = pass.Text;
Properties.Settings.Default.Save();
当我完成更改后,我关闭了表单,并在Form1
中的FormClosed事件中提取了options
表单,我这样做了
conn = new SqlConnection(myConnection.DataSource.ConnectionString);
我认为它会根据connection string
等字符串中的实际值更改Properties.Settings.Default.pass
。但它没有。
所以我的问题是,是否有可能以某种方式改变已经初始化SqlConnection
的字符串?
提前感谢您的时间。
答案 0 :(得分:3)
没有。您必须关闭SqlConnection并打开一个新的。
根据MSDN Docs:
只有在关闭连接时才能设置ConnectionString属性。许多连接字符串值具有相应的只读属性。设置连接字符串后,将更新这些属性,除非检测到错误。在这种情况下,不会更新任何属性。 SqlConnection属性仅返回ConnectionString中包含的那些设置。
请注意这一点,因为它会重置许多连接属性:
在已关闭的连接上重置ConnectionString将重置所有连接字符串值(和相关属性),包括密码。例如,如果设置包含“Database = AdventureWorks”的连接字符串,然后将连接字符串重置为“Data Source = myserver; Integrated Security = true”,则Database属性不再设置为“AdventureWorks”。
答案 1 :(得分:1)
您的ConnectionString
只是因为您这样做而被初始化了一次:
public static string ConnectionString
{
get
{
if (_ConnectionString == null)
_ConnectionString = FunctionToDynamicallyCreateConnectionstring();
return _ConnectionString;
}
}
在调用属性一次后,将使用记录的值,并且永远不允许更改。
您需要“重置方法”
public void ResetConnectionParams()
{
_ConnectionString = null;
}
这样,下次调用该属性时,允许使用新值重建参数。这意味着将使用新的,已更改的连接字符串创建新连接。确保在某个地方调用这个新方法!
答案 2 :(得分:1)
SqlConnection
的连接字符串只能通过构造函数设置,或者对于现有实例,如果SqlConnection
处于关闭状态(更改连接字符串是什么意思)一个开放的连接?)。
如果SqlConnection
已关闭,您可以设置连接字符串设置ConnectionString
实例上的SqlConnection
属性:
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 ;
}