客户端-服务器安装包.NET

7

我猜这是每个初学者在客户端服务器方面都会遇到的基本问题:我开发了一个 C#.NET Client-Server 软件。

应用程序的基本概述

应用程序包含一个内置数据库,因此如果服务器不可用,则用户可以使用其本地系统上可用的数据库。如果服务器上有数据库可用,则将使用服务器数据库。单击按钮时,两个数据库会相互同步。因此,我有两个连接字符串,一个是用于本地系统的,另一个是用于服务器的。它们都是动态创建的。

对于:客户端安装 -> 现在我正在使用 Click One 应用程序

  1. 我的客户端系统使用本地数据库,我与我的应用程序一起安装。

问题1

我有一个基于 SQL Server Express 的数据库部署。我创建了一个带有像 SQL Server 2008 这样的先决条件的 ClickOne 应用程序。当我安装 ClickOne 时,我的应用程序会正确安装,没有任何错误,但是在启动应用程序时,它会给我错误,说我的应用程序无法在 C:\Users\Xnor\AppData\Local\Apps\2.0\Data\N24R9574.9H1\V0Q1MX0C.0X9\.... 找到数据库。

我上网搜索并发现,将我的 .mdf 复制到此位置将解决我的问题。但是为什么会发生这种情况?为什么它不能自己复制?

难道没有任何办法将 DB 永久附加到我的应用程序中,以便我可以避免这个手动工作吗?

到处都是将 .mdf 文件复制到该位置的说明,仅此而已。那是否有可能和建议将 .mdf 附加在资源中,并可从其中使用呢?寻求专家意见,最佳完成方式。


对于服务器:

我通常安装 Microsoft SQL Server Management Studio Express,然后在那里为我的服务器创建数据库,然后它就可以与我的应用程序一起使用了。

问题2

如何简化这些步骤?告诉非 IT 人员并教他们在服务器上始终安装 Microsoft SQL Server Management Studio Express,然后在其中创建一个数据库,然后将其连接字符串提供给应用程序以使其运行,这会带来很多问题。


我的基本要求只是让用户在安装过程中获得流畅的体验。因为进行安装的人并不是高级技术人员。他们可以一路点击“下一步”,但他们不喜欢做太多配置。有没有更专业的方法来做到这一点?我猜这是客户端-服务器软件中最重要的事情,我从来没有见过这样的软件会要求你做这么多配置。
我不想使用Click-one Deployment,因为它看起来非常不专业,而且我感觉它的功能非常有限。所以请建议其他可满足此要求的替代方案。
另外,我想知道这是非常重要的事情,但我在谷歌和YouTube上找不到现成的教程,我无法找到正确的方向来自动化这个事情,或者可能有一种方法可以减少步骤。
我准备部署两个设置:一个用于客户端,一个用于服务器。
如果需要其他信息,请告诉我。期待您的支持。谢谢。

在服务器端需要安装什么?只需要安装每个客户端连接的数据库服务器吗?还是需要部署您的程序的某个部分作为服务或类似的东西? - Alejandro
6个回答

1

对于在客户端部署,我会重新考虑本地数据库的策略。问题是,据我所知,您在每个客户端上都使用SQL Server和一个本地的.mdf文件,我认为这更像是一个问题而不是解决方案,因为它像任何普通的DB服务器一样工作,但安装在本地,带来了所有的麻烦。而且由于客户端不应该接收外部连接(如果我在这里说错了,请纠正我),完整的服务器将是过度的。我的想法是选择一个不同的DB引擎用于客户端:

  • SQLite是我的首选。它是一个嵌入式数据库引擎,在其最小形式下只有一个DLL,而在其.NET封装中还有更多的文件。它将数据存储在您选择的文件中,并使用标准SQL语言访问它。部署非常简单,只需将几个库复制到您的安装文件夹中即可,这符合您所需的下一步/下一步/下一步的安装程序。缺点是它仅支持SQL Server具有的功能子集,这可能或可能不是您特定情况下的问题。
  • SQL Server Compact Edition非常相似,完全在本地运行,没有真正的服务器并访问本地文件。其功能与SQLite有些相似,并且仍然远低于SQL Server,但对于本地副本来说,对我来说似乎足够了。部署也很简单,只需将一堆文件复制到程序文件夹中。这篇文章提供了安装此数据库引擎的一些提示
  • 如果您需要真正SQL Server的全部功能,则另一种选择是利用SQL 2012的一个新功能,称为“LocalDB”。它基本上是来自SQL Express的同一数据库引擎,但它可以根据需要运行,无需安装和维护服务,只需在应用程序的第一次连接下在用户上下文中运行。这使您可以使用几乎相同的功能集,但管理更加简单。对于部署,您必须运行单独的安装程序,除了本地管理员权限外,不需要太多知识,然后连接和使用几乎相同。如果您正在使用比简单的数据存储更多的功能,则这将是一个不错的折衷方案。
对于客户端数据库本身,我不会在安装程序中包含它。相反,当程序运行并首次需要使用它时,它将尝试打开它,如果找不到,则从头开始创建它。这可以通过将DB创建脚本捆绑在应用程序内部来完成,该脚本将按顺序运行所有脚本以创建空的DB(基本上是发送一堆CREATE TABLE / CREATE VIEW / CREATE PROCEDURE / 创建任何内容)。有些ORM甚至可以自动化此步骤(但我认为这不是一个好主意)。由于这只会发生一次,因此不应对性能产生很大影响,并且还将使程序在某种程度上抵抗DB被删除的情况。
所有这些都必须在每台客户机上完成,但我认为可能很容易创建一个非常简单的next/next/next安装程序。
现在来看服务器端。没有干预地安装服务器的简便方法要困难得多。问题基本上在于,有许多配置超出了您的系统范围,但却可能影响它。数据库引擎本身就是其中之一,因为它需要配置权限、设置数据库、允许外部远程连接、启用协议并配置自动备份。此外,服务器可能包括防火墙,其端口需要打开以接受传入连接,可能会有杀毒软件干扰网络活动等等。
我认为这些事情超出了您的应用程序所能及应该做的事情,即使这意味着IT人员需要手动完成(这并不是太大的负担,因为这只需要做一次)。我在这里没有什么好的建议,Sharpeye500 的建议很好,因为它允许无人值守的SQL Server安装,但前提是必须满足正确的条件,而这可能并不总是成立。
你可以自动化创建服务器端数据库。你可以使用一个“安装程序”,执行与我为客户端提出的相同的操作,即发送CREATE DATABASE / CREATE TABLE语句以从头开始构建空数据库。唯一需要的参数是服务器名称/数据库名称/用户名/密码。安装程序可以从那里构建连接字符串。客户端应用程序可以使用类似的方法来定位服务器数据库,并且这些参数也可以包含在客户端安装程序中。

1
我建议您使用inno setup来进行客户端和服务器端的平滑(下一步>下一步>下一步)安装。目前,我正在使用inno setup安装程序来进行客户端安装。
参考资料:1.如何使用inno setup构建安装程序2. Inno Setup用于.NET应用程序 问题1: - 您可以使用SQL Server附加数据库(解决资源管理器>添加新项> SQL Server数据库(或者)您可以在客户端系统中安装SQL Server(标准版/Express),并通过Inno Setup创建数据库和数据库对象。
请按照以下步骤创建客户端安装程序。
  1. Windows应用程序 - 使用Visual Studio Deployment Projects创建exe文件
  2. SQL Server安装设置
  3. 将DB脚本保存为.SQL文件(创建数据库,创建表,创建存储过程)

下载Inno Setup > 创建项目 > 引用路径 > 构建Inno Setup

注意:您可以在Inno Setup文件夹中包含其他先决条件,并且可以按顺序安装步骤,例如1.NET Framework,2.Windows应用程序EXE,3.SQL Server Express,4.DB脚本还原。

构建Inno Setup后,您将仅拥有一个客户端安装的设置。同样,您可以为服务器端安装创建另一个设置。


1
问题1:将SQL数据库添加到应用程序-应该使用Visual Studio解决方案。
单击使用数据库的项目(或更好地,首先为其创建一个文件夹),Ctrl+Shift+A>Data>Local Database / Service-Based Database。
然后,您应该填充数据库,更改连接字符串等。
该项目将为您提供可以被篡改并在安装中更改的连接字符串,因为文件路径可能会有所变化。
这样,它将通过您的ClickOnce复制数据库以在项目安装中使用。

注意:选择数据库类型(SDF vs. MDF)并不是一个很难的问题。
如果可以使用MDF,则具有更好的性能和更好的功能,但需要本地安装SQLExpress。

问题2:SSMS(Menegment Studio)不是必需品或类似的东西。
现在,我倾向于相信您正在服务器上安装数据库运行应用程序 - 您不应该这样做。为数据库使用专用服务器。
但是,对于您的答案,您可以做两件事情使其更好:
1. 您可以创建一个名为“model”的SQL数据库 - 这对于数据库创建非常理想,因为它会将自己复制到新数据库中,并使事情变得更加简单。
然后,在安装部分中,您的应用程序可以运行SQLConnection.CreateDatabase,它将复制模型并为您的需求创建数据库。
2. 您可以迁移到使用EntityFramework等较新的解决方案,在那里开发您的类,EF负责存储。
我已经有一段时间没有使用Clickonce了,但我知道您可以使用您的文本、您的标志等制作定制版本...
如果您想要自动化,其中一步是运行您的代码(如果您提供它)。您可以创建安装文件。只需创建(Ctrl-Shift-A)安装文件(它就在那里),您可以覆盖方法并运行您想要的内容(文件复制、调整、要求检查等)。


0

SQL Server Express无法作为应用程序的一部分静默安装吗?

public bool InstallExpress()
            {

                //In both cases, we run Setup because we have the file.
                Process myProcess = new Process();
                myProcess.StartInfo.FileName = sqlExpressSetupFileLocation;
                myProcess.StartInfo.Arguments = "/qb " + BuildCommandLine();
                /*      /qn -- Specifies that setup run with no user interface.
                        /qb -- Specifies that setup show only the basic 
user interface. Only dialog boxes displaying progress information are 
displayed. Other dialog boxes, such as the dialog box that asks users if 
they want to restart at the end of the setup process, are not displayed.
                */
                myProcess.StartInfo.UseShellExecute = false;

                return myProcess.Start();

            }

这个链接可能会有帮助

如果你能检测出你的应用程序将要连接本地数据库还是服务器数据库,那么在打开应用程序时,在你的代码中尝试安装 SQL Express 本地版本,以避免非 IT 人员需要进行的配置。


0

如果你采用客户端-服务器的方式,且网络是本地局域网,那么为什么不在服务器上安装服务器应用程序和数据库,而在客户端上安装其他客户端呢?这样做有没有特定的原因?


0
这个问题的答案很简单,正如Balamurugan所暗示的那样,为一个好的第三方安装程序付费。它们通常是可编程的,因此您可以完全按照自己的意愿进行操作。
或者,您可以学习更多关于MS Setup项目和创建自定义安装服务的知识。这需要更多的工作量,但它是免费的(除了您的时间)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接