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

时间:2014-01-22 21:34:05

标签: c# sql-server sqlconnection

我的表单中有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的字符串?

提前感谢您的时间。

3 个答案:

答案 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 ;
}