首页 > 解决方案 > 如何创建动态数据库连接字符串C#

问题描述

我刚刚创建了一个带有localhost数据库的桌面 Winforms 应用程序。我使用的连接字符串是这样的:

SqlConnection connect = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Administrator\Desktop\learningsystem\LearningSystem\LearningSystem\LearningSystem.mdf;Integrated Security=True");

如果我想在其他计算机上运行我的应用程序,我应该如何让它工作?

编辑:解决方案 感谢所有帮助!我尝试了以下步骤。我认为它现在正在工作。但是,如果我做了一些棘手的事情,请纠正我。1.在项目属性设置中增加一个新的设置项。App.config 会自动更新:

<connectionStrings>
    <add name="LearningSystem.Properties.Settings.LearningConn" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\LearningSystem.mdf;Integrated Security=True;Connect Timeout=30"
        providerName="System.Data.SqlClient" />
</connectionStrings>

2.在我的程序中,只需添加如下语句即可连接sql server

        SqlConnection connect = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename=|DataDirectory|\LearningSystem.mdf;Integrated Security = True; Connect Timeout = 30");

进一步的问题 如果其他人将在他们的计算机上运行此应用程序(不在同一网络中),他们只需进入项目设置并通过选择我提供给他们的数据库文件来更改值,connectionString 会自动更改,对吗?

谢谢!

标签: c#sql-serverdatabase

解决方案


在你的应用程序中硬编码这些东西通常是个坏主意。通常,应用程序设置和连接字符串放在应用程序的配置文件中(在 ConnectionStrings 部分)。

就像所有字符串一样,您可以从动态部分(变量、设置等)构建连接字符串,然后将生成的连接字符串传递给 SqlConnection 构造函数。同样,为了使这些单独的部分可配置而不在您的应用程序中进行硬编码,您可能希望将它们添加到应用程序的配置文件中(在 AppSettings 部分中)。但恕我直言,在大多数情况下,这是一个过于复杂的解决方案。将整个连接字符串放在 ConnectionStrings 部分更直接(也更灵活)。

无论如何,为了使您的应用程序可配置,您可以使用应用程序的配置文件(App.config 或 Web.config),您需要在项目的 .NET Framework 依赖项中添加对 System.Configuration 的引用并使用 AppSettings 和 ConnectionStrings System.Configuration.ConfigurationManager类的属性。

(当然,还有更多方法可以使您的应用程序可配置。但是使用应用程序配置文件是最直接的解决方案之一。)

编辑:

将您的应用程序部署到另一台计算机时,您也需要复制其数据库。如果您想在多台机器上使用该应用程序并让它们连接到同一个数据库,您可能希望离开 LocalDB 并将数据迁移到 SQL Server (Express) 实例并使其可以通过(本地)网络访问

编辑 2(关于您帖子中最近的编辑):

我在步骤 1 中看到您现在正在解决方案中使用应用程序设置(称为 LearningConn)。没关系。但是,重要的是您还要在步骤 2 中使用该设置,如下所示:

SqlConnection connect = new SqlConnection(Properties.Settings.Default.LearningConn);

如果您在 Visual Studio 中更改设置,它将更新连接字符串。由于该设置可能具有应用程序范围,因此无法在运行时(由用户)更新应用程序中的设置/连接字符串。

我不确定您的连接字符串是否使用 |DataDirectory| 在所有情况下都将始终按预期工作。我只在 ASP.NET Web 应用程序中使用过它。如果它在 WinForms 应用程序中工作,您可以阅读此文档以了解如何设置它。但就我个人而言,我对这种方法有些怀疑。

我个人会选择在连接字符串中使用占位符的解决方案,在将其传递给 SqlConnection 构造函数之前,将其替换为 .mdf 文件的完整路径。

例如,当您使用“{DBFILE}”作为占位符时,LearningConn 设置的值如下所示:

数据源=(LocalDB)\MSSQLLocalDB;AttachDbFilename={DBFILE};Integrated Security=True;Connect Timeout=30

(注意这个值应该是单行,没有任何换行符!)

您可以在应用程序中创建一个名为DbFile(字符串类型)的单独设置,以存储应在连接字符串中代替 {DBFILE} 的实际值。当您对该设置使用范围“用户”时,用户可能会在应用程序内更改该值。保存后,它可能不会直接保存在应用程序的配置文件中,而是保存在隐藏在用户 Windows 用户配置文件某处的附加配置文件中。您可以阅读本文档以了解有关应用程序设置的更多信息。

您在第 2 步中的代码最终可能如下所示:

string connectString = Properties.Settings.Default.LearningConn;
string dbFile = Properties.Settings.Default.LearningSystemDb;
connectString = connectString.Replace("{DBFILE}", dbFile);
SqlConnection connect = new SqlConnection(connectString);

为了让您的应用程序的用户选择并存储要使用的数据库 .mdf 文件,您可以在应用程序的某处包含(变体)以下代码:

using (var dlg = new System.Windows.Forms.OpenFileDialog())
{
    dlg.Title = "Select database file to use";
    dlg.Filter = "Database Files (*.mdf)|*.mdf";
    dlg.CheckFileExists = true;

    if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        Properties.Settings.Default.DbFile = dlg.FileName;
        Properties.Settings.Default.Save();
    }
}

推荐阅读