所以我创建了一个简单的WPF应用程序,允许用户将字符串INSERT到SQLite数据库(.S3DB文件)。用户还可以从数据库中选择一个字符串,并从数据库中删除字符串...非常简单的应用程序。
我想分发这个简单的应用程序,所以我通过创建一个新项目并使用VS2010上的设置向导为应用程序创建了setup.exe文件。当用户安装应用程序时,它会在Program Files目录中创建一个“TestDatabase”文件夹,并将这两个文件与.exe文件一起添加:
当我在计算机上安装它时,我正在开发......一切正常。但是,当我在另一台计算机上安装它时,当我尝试从应用程序(存储在C:\ Program Files(x86)\ TestDatabase \ TestDatabase.s3db中)打开数据库时,它会崩溃。
我想知道是否有人可以帮助解决这个问题?感谢。
答案 0 :(得分:4)
除非您以管理员模式运行,否则无法修改Program Files
目录中的文件。您应该将.s3db文件部署到%appdata%
内的文件夹中。
答案 1 :(得分:1)
你肯定想要解决方程式中的权限部分,但是你也可能遇到我在周末遇到的DbProviderFactories问题,同时想出如何使用sqlite.org中的最新二进制文件。您可以阅读details on my blog post,但简短的回答是您需要一个配置文件条目或类似的代码:
<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>
您需要确保在程序集引用中将“Copy local”设置为true,以便SQLite程序集将包含在\ bin和setup项目中。
答案 2 :(得分:1)
我意识到打开数据库时崩溃的原因是因为我没有在我测试的新计算机上安装安装程序包。安装程序包包括所有运行时组件和依赖项。安装包可以在这里找到:
http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
另外,ravenspoint,RandomEngy和bryanbcook ......你们是对的。从Program Files文件夹中读取/写入数据库是一个坏主意,因为从Program Files文件夹访问数据库时可能会出现权限问题。所以我将数据库保存在AppData文件夹中,可以在没有任何权限问题的情况下读取/写入数据库。
答案 3 :(得分:0)
可能是权限问题。您可能希望使用隔离存储。
也可能是您的项目正在使用GAC的程序集。确保您的程序集是项目的本地程序。
答案 4 :(得分:0)
问题是您的用户无权写入Program Files文件夹。快速解决方法是在
中安装测试db文件C:/Program Data/<your company name>/<your application name>/
但是,使用安装程序将数据库文件拖放到特定文件夹中并不是一个好主意。如果要将更新的应用程序分发给已安装先前版本的用户,则最终会出现问题。最好在应用程序中编写查找数据库的代码,如果找不到则创建一个新代码。这样,更新的应用程序可以使用由先前版本生成的数据库,因此可能代表大量用户投资。
有关如何详细处理数据库驱动的应用程序升级的更多详细信息,请参阅How to manage desktop file database versions?