我在带有数据库的.NET 4.0中有一个winform应用程序(SQLite)。我需要为用户添加一个选项,以便能够更改包含数据库的文件的路径 - 简而言之,更改连接字符串。我使用app.config保存连接字符串,如下所示:
<connectionStrings>
<add name="connectionString" connectionString="Data Source=D:\myDatabase.db; FailIfMissing=True; Version=3"/>
</connectionStrings>
有没有办法允许用户修改app.config文件(它位于Program Files文件夹中)?我不想以管理员身份运行应用程序,是否有办法临时授予用户管理员权限,只有在尝试修改app.config文件时?
如果您对持久存储连接字符串有任何更好的建议,请分享。
谢谢!
编辑: 我实际上可以更改app.config文件:
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.ConnectionStrings.ConnectionStrings["connectionString"].ConnectionString = "Data Source=" + path + "; FailIfMissing=True; Version=3";
config.Save();
ConfigurationManager.RefreshSection("connectionStrings");
问题是当用户不是管理员时,拒绝访问该文件。有解决方法(我不想以管理员身份运行应用程序)?或者有更好的方法来存储我的连接字符串吗?
答案 0 :(得分:1)
您应该使用特殊文件夹。 LocalApplicationData(适用于当前用户 - 仅限本地)或ApplicationData(适用于当前用户 - 漫游):
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
这是您应该将path \ connection字符串存储到user选择的db文件的位置。为Windows操作系统上的所有用户配置文件创建这些文件夹。例如,如果您的登录名是“Hari”,则路径将是“C:\ Users \ Hari \ AppData \ Local”。 Hari完全可以访问这条路,所以他可以写信给它。
此外,这允许多个用户使用您的软件。他们不会互相踩踏。他们都将拥有自己的DB文件。如果这不是您想要的,那么您可以使用此处提到的其他特殊文件夹(如CommonApplicationData):
https://msdn.microsoft.com/en-us/library/system.environment.specialfolder%28v=vs.110%29.aspx
但是要使用其中一些,您可能必须拥有管理员权限。 (对于我上面描述的两个特殊文件夹,您不需要管理员权限。)在这种情况下,您可以在安装时请求DB文件路径。
答案 1 :(得分:1)
我认为你想要做的是使用设置(而不是使用app.config)。请参阅:https://msdn.microsoft.com/en-us/library/aa730869%28v=vs.80%29.aspx
它与配置文件基本相同,但为用户(和您)提供了便捷的访问权限。
首先在设计器中设置默认连接字符串:
然后像textBox1.Text = Properties.Settings.Default.connectionString;
反过来保存它:Properties.Settings.Default.connectionString = textBox1.Text;
并确保保存:Properties.Settings.Default.Save();
答案 2 :(得分:0)
这可能有所帮助:
private static void UpdateSetting(string key, string value)
{
Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
configuration.AppSettings.Settings[key].Value = value;
configuration.Save();
ConfigurationManager.RefreshSection("appSettings");
}