Поделиться через


Сравнение с System.Data.SQLite

В 2005 году Роберт Симпсон создал System.Data.SQLite, поставщик SQLite для ADO.NET 2.0. В 2010 году команда SQLite взяла на себя обслуживание и разработку проекта. Также стоит отметить, что команда Mono вилила код в 2007 году как Mono.Data.Sqlite. System.Data.SQLite имеет длинную историю и превратился в стабильного и полнофункционального поставщика ADO.NET с интеграцией средств разработки для Visual Studio. Новые выпуски продолжают отправлять сборки, совместимые с каждой версией .NET Framework, обратно в версию 2.0 и даже .NET Compact Framework 3.5.

Первая версия .NET Core (выпущенная в 2016 году) была одной, упрощенной, современной и кроссплатформенной реализацией .NET. Устаревшие API и API с более современными альтернативами были намеренно удалены. ADO.NET не включал ни один из API Набора данных (включая DataTable и DataAdapter).

Команда Entity Framework была несколько знакома с базой кода System.Data.SQLite. Брис Ламмбсон, бывший член команды EF, ранее помог команде SQLite добавить поддержку Entity Framework версий 5 и 6. Брис также экспериментировал с собственной реализацией поставщика SQLite ADO.NET примерно в то же время, когда планировался .NET Core. После долгого обсуждения команда Entity Framework решила создать Microsoft.Data.Sqlite на основе прототипа Бриса. Это позволит им создать новую упрощенную и современную реализацию, которая будет соответствовать целям .NET Core.

В качестве примера того, что мы имеем в виду более современным, ниже приведен код для создания определяемой пользователем функции в System.Data.SQLite и Microsoft.Data.Sqlite.

// System.Data.SQLite
connection.BindFunction(
    new SQLiteFunctionAttribute("ceiling", 1, FunctionType.Scalar),
    (Func<object[], object>)((object[] args) => Math.Ceiling((double)((object[])args[1])[0])),
    null);

// Microsoft.Data.Sqlite
connection.CreateFunction(
    "ceiling",
    (double arg) => Math.Ceiling(arg));

В 2017 году .NET Core 2.0 пережила изменение стратегии. Было решено, что совместимость с .NET Framework жизненно важна для успеха .NET Core. Многие удаленные API, включая API набора данных, были добавлены обратно. Как и во многих других случаях, эта разблокировка System.Data.SQLite позволяет также переносить его на .NET Core. Первоначальная цель Microsoft.Data.Sqlite состояла в том, чтобы оставаться легковесной и современной, и это по-прежнему так. См. ограничения ADO.NET для получения подробной информации об API ADO.NET, не реализованных в Microsoft.Data.Sqlite.

При добавлении новых функций в Microsoft.Data.Sqlite учитывается проектирование System.Data.SQLite. Мы пытаемся, когда это возможно, свести к минимуму изменения между двумя способами, чтобы упростить переход между ними.

Типы данных

Самое большое различие между Microsoft.Data.Sqlite и System.Data.SQLite заключается в том, как обрабатываются типы данных. Как описано в типах данных, Microsoft.Data.Sqlite не пытается скрыть базовую причудливость SQLite, которая позволяет указывать любую произвольную строку в качестве типа столбца, и имеет только четыре примитивных типа: INTEGER, REAL, TEXT и BLOB.

System.Data.SQLite применяет дополнительную семантику к типам столбцов, сопоставляя их непосредственно с типами .NET. Это дает поставщику ощущение более строгой типизации, но имеет некоторые шероховатости. Например, им пришлось ввести новую инструкцию SQL (TYPES), чтобы указать типы столбцов выражений в инструкциях SELECT.

Строки подключения

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

Ключевое слово Альтернатива
Размер кэша Отправьте PRAGMA cache_size = <pages>
ОшибкаПриОтсутствии Использовать Mode=ReadWrite
FullUri Использование ключевого слова источника данных
Режим журнала Отправьте PRAGMA journal_mode = <mode>
Устаревший формат Отправьте PRAGMA legacy_file_format = 1
Максимальное число страниц Отправьте PRAGMA max_page_count = <pages>
Размер страницы Отправьте PRAGMA page_size = <bytes>
Только для чтения Используйте Mode=ReadOnly
Синхронный Отправить PRAGMA synchronous = <mode>
Ури Использование ключевого слова источника данных
Используйте кодировку UTF16 Отправить PRAGMA encoding = 'UTF-16'

Авторизация

В Microsoft.Data.Sqlite нет API, предоставляющего обратный вызов авторизации SQLite. Используйте запись #13835 для предоставления отзывов об этой функции.

Уведомления об изменении данных

В Microsoft.Data.Sqlite нет API, предоставляющего уведомления об изменении данных SQLite. Используйте #13827 для предоставления отзывов об этой функции.

Модули виртуальной таблицы

Microsoft.Data.Sqlite не имеет API для создания модулей виртуальной таблицы. Используйте № проблемы , #13823, для предоставления обратной связи об этой функции.

См. также