C# WinForm 应用程序 - 如何保存连接字符串 (SQLite)

C# WinForm application - How to save connection string (SQLite)

我在 .NET 4.0 中有一个带有数据库 (SQLite) 的 winform 应用程序。我需要为用户添加一个选项,以便能够更改包含数据库的文件的路径——简而言之,更改连接字符串。我使用 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");

问题是当用户不是管理员时,对文件的访问被拒绝。是否有解决方法(我不想 运行 该应用程序作为管理员)?还是有更好的方法来存储我的连接字符串?

这可能有帮助:

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");
}

发件人:App.Config change value

您应该使用特殊文件夹。 LocalApplicationData(适用于当前用户 - 仅限本地)或 ApplicationData(适用于当前用户 - 漫游):

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

这是您应该将路径\连接字符串存储到用户选择的数据库文件的位置。这些文件夹是为 Windows OS 上的所有用户配置文件创建的。例如,如果您的登录名是 "Hari",则路径将为 "C:\Users\Hari\AppData\Local"。 Hari 拥有此路径的完全访问权限,因此他可以写入它。

此外,这允许多个用户使用您的软件。他们不会踩到对方。他们都有自己的数据库文件。如果这不是您想要的,那么您可以使用此处提到的其他特殊文件夹(如 CommonApplicationData):

https://msdn.microsoft.com/en-us/library/system.environment.specialfolder%28v=vs.110%29.aspx

但是,要使用其中的某些功能,您可能需要拥有管理员权限。 (对于我上面描述的两个特殊文件夹,您不需要管理员权限。)在这种情况下,您可以在安装时询问数据库文件路径。

我想你要做的是使用设置(而不是使用 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();