• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

Проблемы, возникающие при использовании библиотеки System.Data.SQLite.DLL

Каждый, кто только начинает работать с SQLite на C#, может столкнуться с несколькими проблемами использованием этой базы данных. Здесь я хочу остановиться на некоторых вопросах, которые я опустил при написании серии статей про dbFacade. Еще в первой статье я обещал описать варианты использования библиотеки System.Data.SQLite.dll, через которую класс dbFacade работает с базой данных. Так уж исторически сложилось, что в качестве провайдера я использую библиотеку System.Data.SQLite.dll.

Итак, для работы с SQLite на .NET вы подключаете библиотеку System.Data.SQLite.dll в References своего проекта. Если скачать архив SQLite-1.0.66.0-binaries.zip, то в ней вы обнаружите, фактически, три варианта библиотеки. Для работы вам также нужна будет оригинальная библиотека с официального сайта SQLite.org – sqlite3.dll.
Варианты подключения библиотеки и режимы компиляции

Первый вариант, и самый простой – System.Data.SQLite.DLL в корне архива. Эта библиотека откомпилирована под 32-битные системы (другими словами x86) и весит порядка 900 кб. В ней уже зашита sqlite3.dll. Поэтому вам не нужно качать оригинальную библиотеку. Достаточно подключить файл System.Data.SQLite.DLL и все работает.

Второй вариант – такая же библиотека, только для 64-битной платфоры. В нее, как и в предыдущую, вшита sqlite3.dll. Предназначена, как не трудно догадаться, для компиляции и работу под x64.

Третий вариант – версия библиотеки без вшитой sqlite3.dll под 32-битные системы (размер файла порядка 159 кб и находится в папке ManagedOnly). Дополнительно для работы программы рядом должна «лежать» sqlite3.dll. Преимущество этого варианта в том, что вы можете использовать самую последнюю версию sqlite3.dll. В предыдущие две вшиты версии 3.6.1. На данный момент доступна версия 3.7.6.2.

Теперь поговорим о боках, возникающих при использовании на различных типах операционных систем (32-х и 64-ти битных).

Представим что вы работаете в 32-битной системе: XP, Vista или Win7 – не важно. При компиляции вы можете использовать только первый и третий вариант подключения, а в настройках проекта вам доступны только два режима компиляции – ANY CPU и x86. В этом случае ваше приложение будет адекватно работать на 64-битных платформах.

Теперь представим, что вы «сидите» под 64-х битной виндой. В этом случае вы можете использовать все три возможности подключения и компилировать вашу программу как под 32-х, так и под 64-х битную платформу. Вот здесь и начинаются бока. Например, режим компиляции выставлен в ANY CPU и вы подключили библиотеку как описано в первом варианте.

Это возникает потому что ваше приложении определяется системой при запуске как 64-х битное и соответственно все подключаемые библиотеки будут пытаться загружаться в 64-х битном режиме. А sqlite3.dll 32-х битное и другого не бывает. Соответственно из-за этого вы получаете ошибку.

Для того, чтобы ваше приложение работало адекватно как на 32-х, так и на 64-х битных системах – вам необходимо выставить режим компиляции в x86.

Использование с .NET 4.0

Ситуация следующая: у вас приложение для .NET 4.0, подключена библиотека откомпилированная под Framework 2.0 (это System.Data.SQLite.DLL) и еще одна или несколько библиотек под Framework 4.0. System.Data.SQLite.DLL подключена как в первом варианте. При компиляции у вас может быть следующая ошибка:

1 <startup>
2   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
3 </startup>

и меняете на:

1 <startup useLegacyV2RuntimeActivationPolicy="true">
2   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
3 </startup>

После этого ошибка пропадает и все работает нормально.

1 ParametersCollection parameters = new ParametersCollection();
2 parameters.Add("Название поля", SqlDateTime.Null, DbType.DateTime);
3 new dbFacade.Update("Название_таблицы", parameters, "id = 1");

Если у вас возникли вопросы или вы нашли ошибку, пишите, я всегда отвечу.