如何在 C# 中发布带有其数据库的 Windows 窗体应用程序

Posted

技术标签:

【中文标题】如何在 C# 中发布带有其数据库的 Windows 窗体应用程序【英文标题】:how to publish a windows form app with its database in C# 【发布时间】:2021-01-07 15:41:33 【问题描述】:

我用它的数据库制作了一个 Windows 窗体应用程序,我想发布它。该应用程序在我的系统中运行得非常好,但是当我在另一台 PC 上运行它时,它显示有关无法连接到其数据库的错误。 我也将数据库 mdf 和 ldf 文件放在程序文件夹中,但我的应用程序不起作用。

这是我的连接字符串:

string connectionSt = "Data Source=DESKTOP-NLKJ55F;Initial Catalog=IndustryContracts;Integrated Security=True";

【问题讨论】:

您使用的是什么类型的数据库?当您应该使用像 Sqlite 或 Access 这样的 in-process 数据库时,您是否犯了使用像 Sql Server 这样的 server 数据库的错误? 我用的是sql server Sql Server 旨在一次支持多个用户。它希望在专用机器上一直在后台运行,使用大量系统 RAM 来缓存数据,即使您的应用程序没有运行。它具有复杂的部署,需要管理员权限并涉及设置安全和连接属性。对于表单应用程序中的本地数据库来说,这是一个非常糟糕的选择 大多数时候,您不会发布数据库(除非用于静态查找等)。相反,我建议将连接字符串放在开发机器和目标机器的环境中(例如 .NET Core 用户机密或环境变量),并将数据库放在您需要的位置。如果数据库架构发生更改,您可以在其上运行迁移(作为手动脚本或作为 EF 迁移。) 什么是连接字符串。 mdf 文件是附加到 SQL Server 还是使用 (localDb)AttachDatabase?本地 Db 使用数据库的默认文件夹。如下所示:AttachDBFilename=c:\asd\qwe\mydbfile.mdf。本地数据库意味着您没有 SQL Server 并且数据库很小。不要同时使用 Server=myServerAddress;和 AttachDBFilename。 【参考方案1】:

对于学习如何使用数据库开发应用程序的人来说,这是一个常见的错误。

基本上:你有错误的方法。数据库并不是真的要在每台安装了程序的计算机上创建。相反,数据库的理想用例是在服务器中创建的,任何需要使用它的应用程序都可以通过 TCP 等协议简单地连接到它。这有助于封装,也使您的应用程序更紧凑。

所以通常当程序需要读写数据以保存在某个地方时,人们通常会采用诸如写入CSV文件或制表符分隔文件等方法,然后从这些文件中读取。

还有另一种选择,即使用 SQLite 等无服务器数据库,但是,这意味着您需要学习如何实现所述数据库。

最后,作为一种非常不鼓励的方式,以及有点“蛮力”的方法,您可以复制数据库创建脚本,在目标计算机上安装 DBMS,运行脚本来创建数据库,然后更改程序中数据库的连接字符串以匹配新创建的实例,然后安装程序。看看那是多么的笨拙?

请记住:大多数数据库都在服务器中运行,即使该服务器是您的 PC,因此它们被称为实例。自然不应该在每次安装程序时都复制服务器。

【讨论】:

我不同意第一部分。数据库非常适合存储本地数据。您只需要正确类型 的数据库。也就是说,您需要一个 in-process 数据库,例如 Sqlite 甚至 --gasp-- MS Access(因为 Access 引擎已经在 Windows 上可用)。只需避免使用 Sql Server、mysql、Oracle、Postgresql 等服务器产品来担任此角色。 你的意思是不改变我的数据库就没有办法解决我的问题? 除非你想要我描述的那个可怕的选项 3,是的,这就是我的意思。您选择的数据库是基于服务器的,不适合您的用例。

以上是关于如何在 C# 中发布带有其数据库的 Windows 窗体应用程序的主要内容,如果未能解决你的问题,请参考以下文章

HTTPs在jmeter中发布带有标头测试的请求,并将测试结果保存在mongodb中并在grafana中显示[关闭]

C#,当我在 Windows 窗体应用程序中发送电子邮件时,图像显示为空白 [重复]

在Visual Studio中发布控制台应用程序的Ftp选项在哪里

单击 Javascript 链接以在 Python 中发出发布请求

如何单击按钮并打开窗口以在c#中发送电子邮件

如何在 ASP.NET C# 中发送电子邮件