SQLite в кроссплатформенных приложениях C#

Может ли кто-нибудь помочь/подсказать мне, как использовать SQLite lib в Linux (MONO) и Windows (.NET)

В Linux я использую собственный моноклиент 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

Жду любой помощи

Если вы знаете лучший или более простой способ сделать это, буду очень благодарен за информацию.

Спасибо


person alienn    schedule 08.03.2010    source источник
comment
Зачем использовать две разные сборки для выполнения одного и того же?   -  person balexandre    schedule 08.03.2010
comment
в .net нет Mono.Data.Sqlite, поэтому мне пришлось. phxsoftware.com как-то не хотел грузиться под линуксом.   -  person alienn    schedule 08.03.2010


Ответы (9)


Вы можете использовать csharp-sqlite, который является портом Sql-Lite на C#. Он очень активен и основан на версии 3.6.22 SqlLite. См. комментарии Мигеля о попытках ускорить его.

person Kris Erickson    schedule 09.03.2010
comment
+1, просто хотел добавить, что пока проект кажется активным, и они постоянно обновляются с версиями SQLite. - person torial; 20.04.2010
comment
К сожалению, текущая версия (август 2011 г.) предназначена для SQLite 3.7.7.1, а текущая версия SQLite — 3.8.4.3. - person O. R. Mapper; 16.05.2014

Недавно я тоже столкнулся с проблемой: создание приложения, использующего Sqlite в Windows, с помощью Visual Studio и развертывание его на сервере Ubuntu для производства.

Самым простым решением, которое я нашел, является использование драйвера Mono для Sqlite: Mono.Data.Sqlite.

Все могло быть немного проще, но есть ошибка с .Net 4.0, который еще не включен в официальные выпуски Mono.

Поэтому вам придется скомпилировать Mono из исходного кода (здесь):

  • сначала скомпилируйте весь материал Mono
  • вам не нужно устанавливать его, если вы хотите сохранить текущую настройку Mono
  • скопируйте библиотеку Mono.Data.Sqlite.dll

Конечно, вы можете «кросс-компилировать»: я построил Mono на сервере Ubuntu и использовал dll в проекте Windows .Net.

Затем убедитесь, что у вас есть собственная библиотека Sqlite (sqlite3.dll для Windows и sqlite3.so для Linux) в путь к вашей библиотеке: для Windows я просто скопировал sqlite3.dll рядом со сборкой Mono.Data.Sqlite.dll, для Linux должно работать из коробки.

После этого ваш проект должен без проблем работать как в среде Windows/.Net, так и в среде Linux/Mono.

person Pragmateek    schedule 15.01.2014

Вы можете решить различия в именах, используя псевдоним

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

Я думаю, что использование разных сборок для разных сборок является более сложной задачей. Вы можете взглянуть на документацию MSBuild.

person munissor    schedule 08.03.2010
comment
Что делать, если внутренняя реализация (метод и свойства) SqliteCommand и SQLite отличаются? - person A9S6; 08.03.2010
comment
Вы правы, я предположил, что все 2 реализации наследуются от System.Data.SqlClient.SqlCommand - person munissor; 08.03.2010

Существует полностью управляемый перевод SQLite. Если вы используете это, вы можете использовать одну и ту же DLL в Mono и Windows.

Другой способ решить вашу проблему — создать собственный интерфейс базы данных, а затем реализовать этот интерфейс один раз для Mono и один раз для Microsoft .NET в отдельных библиотеках DLL. (В основном так же, как вы создаете код, который работает с разными базами данных)

person Arve    schedule 08.03.2010
comment
он основан на SQLite 3.4.0, который устарел, и я думаю, что база данных будет страдать от проблем несовместимости. - person alienn; 08.03.2010

Вы можете просто использовать моно-реализацию SQLite как для Windows, так и для Linux-версий вашего программного обеспечения. Просто включите сборку mono для SQLite в свой программный пакет и обратитесь к ней локально.

Как вы можете прочитать здесь в последнем сообщении, вы можете использовать управляемый способ mono исключительно в вашем коде и нужно просто по-другому перераспределить нативную часть для windows. Но вам не нужно связываться с управляемыми реализациями и избыточным кодом.

person Oliver Friedrich    schedule 08.03.2010
comment
так что мне нужно предоставить и включить моно sqlite .so в сборку Windows? - person alienn; 08.03.2010
comment
ну, должен признать, это не кажется таким уж простым. - person Oliver Friedrich; 08.03.2010

Библиотека ORM Vici CoolStorage с открытым исходным кодом работает в Windows (.NET), Mono (Mac, Linux и Windows). и MonoTouch (iPhone) с использованием драйвера SQLite этой платформы.

Чтобы использовать его на этих разных платформах, вам не нужно ничего менять в исходном коде. Просто перекомпилируйте, и все должно работать.

person Philippe Leybaert    schedule 08.03.2010

IMO, вы должны сначала попытаться найти реализацию, которая работает как в Windows, так и в Linux. Если это не сработает, создайте сборку, определяющую общий интерфейс для SQLite, и поместите в эту сборку весь свой код "#if LINUX". Затем используйте эту сборку в основном приложении, чтобы не загромождать основное приложение всеми определениями #.

person A9S6    schedule 08.03.2010

Поставщик SQLite ADO.NET на самом деле является сборкой смешанного режима, которая содержит собственную библиотеку SQLite. Эта нативная библиотека, конечно, не одинакова для Windows и Linux, поэтому этот провайдер не работает в Linux. Однако существует управляемая версия поставщика (SQLite-1.0.65.0-managedonly-binaries.zip на странице загрузки). Поэтому я думаю, что вам просто нужно использовать эту версию провайдера и предоставить вместе с ней адекватную встроенную динамическую библиотеку SQLite (.dll в Windows, .so в Linux)

person Thomas Levesque    schedule 08.03.2010

В некоторых ответах предлагается полностью управляемый порт C# для SQLite3. Но, к сожалению, на сегодняшний день ни один выпуск не поддерживает Linux или Mac OS X, несмотря на то, что он компилируется компилятором Mono C#.

Будущий выпуск будет корректно работать на платформах, отличных от Windows, со средой выполнения Mono. С некоторыми оговорками репозиторий исходного кода содержит работающий код.

При этом System.Data.SQLite Реализация, доступная на сайте sqlite.org, работает как с .Net, так и с Mono на платформах Windows и других платформах. Вам просто нужно убедиться, что app.config, используемый Mono во время выполнения, сопоставляет DLL (C++) SQLite3 с соответствующей библиотекой .so или .dylib. Если вы выберете «смешанный режим», то он должен просто работать, и вам не нужно беспокоиться об отдельных dll.

person Stewart    schedule 22.08.2012
comment
Как заставить System.Data.SQLite работать с Mono? Это не так просто, как вы описываете, к сожалению. - person Erwin Mayer; 09.11.2012