C#跨平台应用程序上的SQLite

时间:2010-03-08 10:38:35

标签: c# .net sqlite orm mono

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

在linux上我使用原生单声道sqlite客户端,在Windows上我使用http://sqlite.phxsoftware.com/

有没有办法像这样定义'using'指令:

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

另一个问题是两种实现上的差异很小,例如:

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

等待任何帮助

如果您知道更好或更简单的方法,那么非常感谢您提供信息。

由于

9 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

事情本来可以更简单,但 a bug with .Net 4.0 还没有打包在官方的Mono版本中。

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

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

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

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

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

答案 2 :(得分:2)

您可以使用别名

解决命名差异
#if (linux)
  using SqlCommand = Mono.Data.Sqlite.SqliteCommand;
#else
  using SqlCommand = System.Data.SQLite;

对于不同的构建使用不同的程序集是一个更复杂的任务我认为..您可以查看MSBuild文档

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

有些答案表明完全管理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。