1

所以我创建了一个简单的 WPF 应用程序,它允许用户将字符串插入 SQLite 数据库(.S3DB 文件)。用户还可以从数据库中选择字符串并从数据库中删除字符串……非常简单的应用程序。

我想分发这个简单的应用程序,所以我通过创建一个新项目并使用 VS2010 上的设置向导为该应用程序创建了 setup.exe 文件。当用户安装应用程序时,它会在 Program Files 目录中创建一个“TestDatabase”文件夹,并将这两个文件与 .exe 文件一起添加:

  1. System.Data.SQLite.DLL 文件(因为它是检测到的依赖项)
  2. TestDatabase.s3db 文件(供用户使用的测试数据库)

当我将它安装在我正在开发的计算机上时……一切正常。但是,当我将它安装在另一台计算机上时,当我尝试从应用程序打开数据库(存储在 C:\Program Files (x86)\TestDatabase\TestDatabase.s3db 中)时,它会崩溃。

我想知道是否有人可以帮助解决这个问题?谢谢。

4

5 回答 5

4

Program Files除非您在管理员模式下运行,否则您无法修改目录中的文件。您应该将 .s3db 文件部署到其中的文件夹%appdata%

于 2011-06-03T18:33:13.450 回答
1

你肯定想解决等式的权限部分,但你也可能遇到我在周末遇到的 DbProviderFactories 问题,同时弄清楚如何使用来自 sqlite.org 的最新二进制文件。您可以阅读我的博客文章中的详细信息,但简短的回答是您需要一个配置文件条目或类似这样的等效代码:

<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SQLite" />
    <add name="SQLite Data Provider" 
      invariant="System.Data.SQLite" 
      description=".Net Framework Data Provider for SQLite" 
      type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
  </DbProviderFactories>
</system.data>

并且您需要确保在您的程序集引用中将“复制本地”设置为 true,以便 SQLite 程序集将包含在您的 \bin 和设置项目中。

于 2011-06-08T22:41:17.583 回答
1

我意识到当我打开数据库时它崩溃的原因是因为我没有在我正在测试的新计算机上安装安装包。安装包包括所有运行时组件和依赖项。安装包可以在这里找到:

http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

此外,ravenspoint、RandomEngy 和 bryanbcook……你们是对的。从 Program Files 文件夹读取/写入数据库是一个坏主意,因为从 Program Files 文件夹访问数据库时可能会出现权限问题。所以我将我的数据库保存在 AppData 文件夹中,可以在没有任何权限问题的情况下读取/写入数据库。

于 2011-08-01T06:01:04.883 回答
0

可能是权限问题。您可能希望为此使用独立存储。

也可能是您的项目正在使用来自 GAC 的程序集。确保您的程序集在您的项目中是本地的。

于 2011-06-03T18:30:28.170 回答
0

问题是您的用户没有写入 Program Files 文件夹的权限。快速修复是将测试数据库文件安装在

C:/Program Data/<your company name>/<your application name>/

但是,使用安装程序将数据库文件放到特定文件夹中并不是一个好主意。当您想要将更新的应用程序分发给已安装先前版本的用户时,您最终会遇到问题。最好在您的应用程序中编写代码以查找数据库并在未找到时创建一个新数据库。这样,更新后的应用程序可以使用由先前版本生成的数据库,因此可能代表大量用户投资。

有关如何处理详细数据库驱动的应用程序升级的更多详细信息,请参阅如何管理桌面文件数据库版本?

于 2011-06-08T23:09:37.630 回答