为 WPF 应用程序创建本地数据库

Posted

技术标签:

【中文标题】为 WPF 应用程序创建本地数据库【英文标题】:Creating a Local DB for a WPF application 【发布时间】:2013-09-25 13:33:47 【问题描述】:

我有一个应用程序,我想在与应用程序相同的文件夹中创建一个数据库。我查看了用于 .NET 4.0 的 SQLite,一切看起来都很好,直到出现异常“无法加载文件或程序集 'System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' 或其依赖项之一。试图加载格式不正确的程序。” SQLite 与控制台 .NET 应用程序一起工作。我根本不想使用 SQL Server。除了 XML 文件还有其他选择吗?

【问题讨论】:

This question 对同一场景有一些很好的指导 您可以尝试很多方法来清理和重建解决方案,重新启动 IDE,有时某些进程会使用特定的 DLL,从而结束该进程。这只是一些构建问题,因此无需迁移到其他东西。 【参考方案1】:

SQLite 是您描述的场景的绝佳选择。因为无法正确包含 SQLite 而放弃 SQLite 似乎是错误的结论。通过NuGet 引用它就可以了。库需要SQLite.Interop.dll,您可能没有正确包含它。当您在 x86 下运行时,您可能还包含了类似 x64 版本的内容(有关详细信息,请参阅this)。通过 NuGet 使用它应该没问题。

这是我在 5 分钟内完成的快速设置:

    创建控制台应用程序(VS Express 2012 for Desktop、.NET v4、Any CPU、Debug) 通过 NuGet 安装 使用以下代码 像魅力一样工作!

代码示例:

string dataSource = "SQLiteDemo.db";
SQLiteConnection connection = new SQLiteConnection();
connection.ConnectionString = "Data Source=" + dataSource;
connection.Open();
SQLiteCommand command = new SQLiteCommand(connection);
command.CommandText = "CREATE TABLE IF NOT EXISTS beispiel ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL);";
command.ExecuteNonQuery();
command.CommandText = "INSERT INTO beispiel (id, name) VALUES(NULL, 'Test-Datensatz!')";
command.ExecuteNonQuery();
command.Dispose();
connection.Dispose();

【讨论】:

我尝试通过 NuGet 引用它,但仍然遇到同样的问题。我使用 VS 2010 并针对任何 CPU、.NET 4.0,我也在 VS 2012 中打开了相同的解决方案 当我创建一个控制台应用程序时,它对我来说也可以正常工作。但不适用于引用相同 dll 的 wpf 应用程序 您需要提供更多详细信息才能获得针对您的方案的帮助。它与作为 WPF 或控制台应用程序的应用程序无关。它肯定与您的构建配置和引用库有关。 用空白的 wpf 应用尝试同样的事情。您最有可能遇到异常,即 BadImageFileExeption。我正在开发的机器是 64 位的,而我的应用程序目标平台是任何 cpu。所以我安装了 32 位的 dll 是一个 orblem?如果我确实安装了 64 位 dll,它可以在 32 位机器上运行吗? 正确,很遗憾。【参考方案2】:

我找到了解决此问题的另一种方法。问题出在平台(x86/x64)上。拿到了Sqllite v1.0.88的源码,打开VS 2010的解决方案文件。我注意到默认情况下目标是混合平台。我将其更改为任何 CPU 并构建了 System.Data.SQLite.2010 项目。我在我的项目中引用了这个 dll,我没有遇到 x86/x64 平台的问题。一个 dll 对两者都有效。

【讨论】:

以上是关于为 WPF 应用程序创建本地数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用本地数据库的 WPF C# 应用程序

在 WPF 应用程序中本地保存数据的最佳方法是啥?

WPF本地化问题

如何在 c# wpf 中使用本地数据库 .sdf?

WPF应用程序本地化方法(详细)

wpf 数据库是webapi的项目怎么改为本地调用执行?