如何让我的C#应用程序实际上与其SQLite数据库的副本一起部署?

jvidinwx  于 2023-03-13  发布在  SQLite
关注(0)|答案(1)|浏览(150)

我正在开发一个使用SQLite数据库的C#应用。
我在app.config中指定了一个连接字符串,它使用相对路径指向数据库文件。
相对于项目根目录的目标是./Data/MyDb.db
然而,基于我的发布属性和VS发布菜单,可能会发生两件事:
备选办法1:
在Project〉Properties〉Publish〉Application Files中,如果我将/data/MyDb. db的发布状态标记为“Include”,则在部署应用程序时,我不知道数据库文件位于何处。它确实在应用程序中成功保存和检索数据,但我不知道这些更改正在写入何处,因为安装文件夹X1 M1 N1 X中的文件没有存储它们。我可以添加一条新记录,不对文件进行任何修改,但应用程序仍然能够检索记录,即使在重新启动PC后,这意味着它确实在某个地方保存数据。
备选方案二:
如果我将data/MyDb.db文件的发布状态标记为“Data File”,当我部署应用程序并在其中写入数据时,所有数据都存储在开发项目文件夹中的同一个文件中。部署不会将文件复制到其安装文件夹。这看起来可能并不那么不方便,因为至少我知道更改正在写入的位置,但它看起来很麻烦,因为我需要在项目文件夹中拖动,无论我想在哪里安装应用程序,而它应该是完全独立的。
有没有办法让项目把数据库文件复制到安装文件夹中,或者至少确定实时应用存储更改的位置?或者我遗漏了什么?有没有更好的方法来集成数据库?

szqfcxe2

szqfcxe21#

没有“视觉选项”,很多事情都可能无法解决这个问题。
正如您所说,Copy to output只适用于调试bin,而不是发布。
如果您没有尝试任何方法,“按原样”解决方案是:
打开.csproj文件并添加以下内容:

<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
  <ItemGroup>
    <DataModelFiles Include="$(ProjectDir)..\YourProjectName\yourSQLiteFile.db" />
  </ItemGroup>
  <Copy SourceFiles="@(DataModelFiles)" DestinationFolder="$(PublishDir)" SkipUnchangedFiles="false" />
</Target>

只更改示例的目录和文件名,不更改任何其他内容。我使用了项目主目录,但您可以使用其他目录。我不使用bin,因为这将复制我的调试数据库,我需要一个新的空白SQLite文件。

但请注意:

不是必需的,但有助于工作:

  • 将文件包含到项目中
  • 从文件属性中将其设置为“始终复制”和“内容”。
  • 如果.csproj文件不在排除文件等组中,请签入该文件:

在csproj内部:

<ItemGroup>
<None Remove="yourSQLiteFile.db" />
</ItemGroup>

您将尝试从Visual Studio中包含,但不起作用,不执行任何操作,您需要使用文本编辑器(如记事本++)将其从文件中删除

相关问题