如何创建动态数据库连接字符串C#

时间:2018-05-12 10:04:28

标签: c# sql-server database

我刚创建了一个带有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将自动更改,对吧?

谢谢!

3 个答案:

答案 0 :(得分:1)

在您的应用程序中对这些内容进行硬编码通常是一个坏主意。通常,应用程序设置和连接字符串放在应用程序的配置文件中(在ConnectionStrings部分中)。

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

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

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

修改

将应用程序部署到另一台计算机时,您还需要复制其数据库。如果要在多台计算机上使用该应用程序并让它们连接到同一数据库,您可能希望保留LocalDB并将数据迁移到SQL Server(Express)实例和make it accessible over the (local) network

编辑2(关于帖子中的最新修改):

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

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

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

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

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

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

  

数据   源=(的LocalDB)\ MSSQLLocalDB; AttachDbFilename = {} DBFILE;集成   安全性=真;连接超时= 30

(请注意,此值应该是一行,没有任何换行符!)

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

第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();
    }
}

答案 1 :(得分:0)

你的问题不明确! 您需要在2台或更多台PC上使用一个数据库吗?

OR

您需要使用2个独立的程序吗? 如果你需要2个独立的程序:

您必须将.mdf文件复制到同一地址的其他PC或在app.config中保留mdf地址并在连接到SQL之前将其读取。

How to Read From app.config

如果您需要使用一个Db,则必须连接到SQL Server等数据库服务器,并在connection.trings标记的app.config中保留连接字符串。

Get connection string from App.config

答案 2 :(得分:0)

如果您想在其他PC上工作,而不是动态构建它,请使连接字符串更通用:

Server=(localdb)\\mssqllocaldb;Database=LearningSystem;Trusted_Connection=True;MultipleActiveResultSets=true

这应该在&#39; mssqllocaldb&#39;下创建mdf文件。在%appdata%中为每个用户。您可能需要安装LocalDb(在SQL Server安装期间打勾)