【问题标题】:SQLite on C# Cross-Platform ApplicationsC# 跨平台应用程序上的 SQLite
【发布时间】:2011-01-24 22:23:35
【问题描述】:

有人可以帮助/指导我在 Linux (MONO) 和 Windows (.NET) 上使用 SQLite lib

在 linux 上我使用原生 mono sqlite 客户端,在 windows 上我使用 http://sqlite.phxsoftware.com/

有没有办法像这样定义“使用”指令:

#if (linux)
  using Mono.Data.Sqlite;
#else
  using System.Data.SQLite;

另一个问题是两种实现方式的细微差别,例如:

cmd = new SqliteCommand(); // mono
cmd = new SQLiteCommand(); // sqlite.phxsoftware.com

等待任何帮助

如果您知道更好或更简单的方法来做到这一点,非常感谢您提供信息。

谢谢

【问题讨论】:

  • 为什么要使用 2 个不同的程序集来执行相同的操作?
  • .net 上没有 Mono.Data.Sqlite,所以我不得不这样做。 phxsoftware.com 不知何故不想在 linux 下加载。

标签: c# .net sqlite orm mono


【解决方案1】:

有一个完全托管的SQLite translation。如果你使用它,那么你可以在 Mono 和 Windows 上使用相同的 DLL。

另一种解决问题的方法是创建自己的数据库接口,然后在单独的 DLL 中为 Mono 和 Microsoft .NET 实现一次该接口。 (基本上与创建针对不同数据库运行的代码的方式相同)

【讨论】:

  • 它基于 SQLite 3.4.0,它已经过时,我猜数据库会遇到不兼容问题
【解决方案2】:

您可以使用别名解决命名差异

#if (linux)
  using SqlCommand = Mono.Data.Sqlite.SqliteCommand;
#else
  using SqlCommand = System.Data.SQLite;

我认为为不同的构建使用不同的程序集是一项更复杂的任务。你可以查看 MSBuild 文档

【讨论】:

  • 如果SqliteCommand和SQLite的内部实现(方法和属性)不同怎么办?
  • 你是对的,我假设所有 2 实现都继承自 System.Data.SqlClient.SqlCommand
【解决方案3】:

开源的Vici CoolStorage ORM 库使用该平台的 SQLite 驱动程序在 Windows (.NET)、Mono(Mac、Linux 和 Windows)和 MonoTouch (iPhone) 上运行。

要在这些不同的平台上使用它,您无需对源代码进行任何更改。只需重新编译,它应该可以工作。

【讨论】:

    【解决方案4】:

    IMO,您应该首先尝试找到一种适用于 Windows 和 Linux 的实现。如果这不起作用,请创建一个为 SQLite 定义通用接口的程序集,并将所有“#if LINUX”代码放入该程序集中。然后在主应用程序中使用该程序集,以避免所有 # 定义使主应用程序混乱。

    【讨论】:

      【解决方案5】:

      SQLite ADO.NET 提供程序实际上是一个混合模式程序集,其中包含本机 SQLite 库。当然,这个原生库在 Windows 和 Linux 上是不一样的,所以这个提供程序在 Linux 上不起作用。但是,提供程序有一个仅限托管的版本(下载页面上的 SQLite-1.0.65.0-managedonly-binaries.zip)。所以我认为你只需要使用这个版本的提供程序,并提供足够的原生 SQLite 动态库(Windows 上的 .dll,Linux 上的 .so)

      【讨论】:

        【解决方案6】:

        您可以只为您的软件的 Windows 和 Linux 版本使用 SQLite 的单声道实现。只需将 SQLite 的 mono 程序集包含在您的软件包中并在本地引用即可。

        正如您在上一篇文章中看到的here 一样,您可以仅在代码中使用mono 的托管方式,并且只需要以不同的方式重新分配Windows 的本机部分。但是您不必通过它来处理托管实现和冗余代码。

        【讨论】:

        • 那么需要在 windows 构建中提供和包含 mono sqlite .so 吗?
        • 好吧,我不得不承认,它看起来并不那么简单。
        【解决方案7】:

        您可以使用csharp-sqlite,它是 Sql-Lite 的 C# 的端口。它非常活跃,基于 SqlLite 的 3.6.22 版本。请参阅 Miguel 的 comments 尝试加快速度。

        【讨论】:

        • +1,只是想补充一点,到目前为止,该项目似乎处于活动状态,并且它们与 SQLite 版本保持同步。
        • 不幸的是,当前版本(从 2011 年 8 月开始)适用于 SQLite 3.7.7.1,而当前版本的 SQLite 是 3.8.4.3。
        【解决方案8】:

        一些答案​​建议使用完全托管的C# port of SQLite3。但是,遗憾的是,尽管可以使用 Mono C# 编译器进行编译,但迄今为止没有任何版本支持 Linux 或 Mac OS X。

        未来的版本将在具有 Mono 运行时的非 Windows 平台上正确运行。需要注意的是,source repository 包含有效的代码。

        话虽如此,sqlite.org 提供的System.Data.SQLite 实现可在Windows 和非Windows 平台上与.Net 和Mono 一起使用。您只需确保 Mono 在运行时使用的 app.config 将 (C++) SQLite3 dll 映射到适当的 .so 或 .dylib 库。如果您选择“混合模式”版本,那么它应该正常工作,您无需担心单独的 dll。

        【讨论】:

        • 如何使 System.Data.SQLite 与 Mono 一起工作?不幸的是,它并不像你描述的那么简单。
        【解决方案9】:

        我最近也遇到了这个问题:使用 Visual Studio 在 Windows 上构建一个使用 Sqlite 的应用程序,并将其部署在 Ubuntu Server 机器上进行生产。

        我找到的最简单的解决方案是使用 Sqlite 的 Mono 驱动程序:Mono.Data.Sqlite

        事情本来可以简单一点,但是 a bug with .Net 4.0 尚未打包在 Mono 官方版本中。

        所以你必须从源代码 (the general instructions are here) 编译 Mono:

        • 首先编译整个 Mono 的东西
        • 如果您想保留当前的 ​​Mono 设置,则无需安装它
        • 复制 Mono.Data.Sqlite.dll

        当然可以“交叉编译”:我在 Ubuntu Server 上构建了 Mono,并在 Windows .Net 项目中使用了 dll。

        然后确保您的库路径中有 the native Sqlite library(对于 Windows 是 sqlite3.dll,对于 Linux 是 sqlite3.so):对于 Windows,我只是复制了 Mono.Data 旁边的 sqlite3.dll .Sqlite.dll 程序集,对于 Linux,它应该可以开箱即用。

        您的项目应该可以在 Windows/.Net 和 Linux/Mono 环境中无缝运行。

        【讨论】:

          猜你喜欢
          • 2011-08-26
          • 2016-01-19
          • 1970-01-01
          • 1970-01-01
          • 2013-12-30
          • 1970-01-01
          • 1970-01-01
          • 2012-10-12
          • 1970-01-01
          相关资源
          最近更新 更多