为了账号安全,请及时绑定邮箱和手机立即绑定

如何在.net中以编程方式设置连接字符串?

如何在.net中以编程方式设置连接字符串?

精慕HU 2019-11-13 15:35:55
我想以编程方式设置连接字符串,而绝对不更改任何配置文件/注册表项。我有这段代码,但不幸的是,它抛出了“配置为只读”异常。ConfigurationManager.ConnectionStrings.Clear();string connectionString = "Server=myserver;Port=8080;Database=my_db;...";ConnectionStringSettings connectionStringSettings =   new ConnectionStringSettings("MyConnectionStringKey", connectionString);ConfigurationManager.ConnectionStrings.Add(connectionStringSettings);编辑: 问题是我有从配置读取连接字符串的现有代码。因此,手动或通过资源设置配置字符串似乎不是有效的选项。我真正需要的是一种以编程方式修改配置的方法。
查看完整描述

3 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我已经在博客中的帖子中对此进行了撰写。诀窍是使用反射来戳值,以获取对非公共字段(和方法)的访问。


例如。


var settings = ConfigurationManager.ConnectionStrings[ 0 ];


var fi = typeof( ConfigurationElement ).GetField( "_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic );


fi.SetValue(settings, false);


settings.ConnectionString = "Data Source=Something";


查看完整回答
反对 回复 2019-11-13
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

我一直在寻找相同问题的答案,以允许用户通过选择本地SQL Server来更改单击一次应用程序中的连接字符串。


下面的代码显示了一个用户窗体,该窗体与所有本地可用的SQL Server联系并允许他们选择一个。然后,它为该服务器构造一个连接字符串,并从表单上的变量返回它。然后,代码会修改配置文件并节省下来。


string NewConnection = "";

// get the user to supply connection details

frmSetSQLConnection frm = new frmSetSQLConnection();

frm.ShowDialog();

if (frm.DialogResult == DialogResult.OK)

{

    // here we set the users connection string for the database

    // Get the application configuration file.

    System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

    // Get the connection strings section.

    ConnectionStringsSection csSection = config.ConnectionStrings;

    foreach (ConnectionStringSettings connection3 in csSection.ConnectionStrings)

    {

        // Here we check for the preset string - this could be done by item no as well

        if (connection3.ConnectionString == "Data Source=SQL204\\SQL2008;Initial Catalog=Transition;Integrated Security=True")

        {

             // amend the details and save

             connection3.ConnectionString = frm.Connection;

             NewConnection = frm.Connection;

             break;

        }

    }

    config.Save(ConfigurationSaveMode.Modified);

    // reload the config file so the new values are available


    ConfigurationManager.RefreshSection(csSection.SectionInformation.Name);


    return clsDBMaintenance.UpdateDatabase(NewConnection))

}


查看完整回答
反对 回复 2019-11-13
?
慕容3067478

TA贡献1773条经验 获得超3个赞

解决此问题的另一种方法是直接对集合进行操作:


var settings = ConfigurationManager.ConnectionStrings;

var element = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

var collection = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);


element.SetValue(settings, false);

collection.SetValue(settings, false);


settings.Add(new ConnectionStringSettings("ConnectionStringName", connectionString));


// Repeat above line as necessary


collection.SetValue(settings, true);

element.SetValue(settings, true);


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 494 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信