Comparação com System.Data.SQLite
Em 2005, Robert Simpson criou o System.Data.SQLite, um provedor SQLite para ADO.NET 2.0. Em 2010, a equipe do SQLite assumiu a manutenção e o desenvolvimento do projeto. Também vale a pena observar que a equipe Mono bifurcou o código em 2007 como Mono.Data.Sqlite. System.Data.SQLite tem um longo histórico e evoluiu para um provedor ADO.NET estável e completo com ferramentas do Visual Studio. As novas versões continuam a enviar assemblies compatíveis com todas as versões do .NET Framework até a versão 2.0, e mesmo com o .NET Compact Framework 3.5.
A primeira versão do .NET Core (lançada em 2016) foi uma implementação única, leve, moderna e multiplataforma do .NET. APIs obsoletas e APIs com alternativas mais modernas foram removidas intencionalmente. O ADO.NET não incluiu nenhuma das APIs DataSet (incluindo DataTable e DataAdapter).
A equipe do Entity Framework era familiarizada de alguma forma com a base de código System.Data.SQLite. Brice Lambson, membro da equipe do EF, já havia ajudado a equipe do SQLite a adicionar o suporte para as versões 5 e 6 do Entity Framework. Ele também testou a própria implementação de um provedor ADO.NET do SQLite na mesma época em que o .NET Core estava sendo planejado. Após uma longa discussão, a equipe do Entity Framework decidiu criar o Microsoft.Data.Sqlite com base no protótipo de Brice. Isso permitiria que eles criassem uma implementação leve e moderna que se alinhasse às metas do .NET Core.
Como exemplo do que significa ser mais moderno, veja o código de criação de uma função definida pelo usuário em System.Data.SQLite e em 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));
Em 2017, o .NET Core 2.0 passou por uma mudança de estratégia. Foi decidido que a compatibilidade com o .NET Framework era vital para o sucesso do .NET Core. Muitas das APIs removidas, incluindo as APIs DataSet, foram adicionadas novamente. Como ocorreu com muitos outros, isso desbloqueou o System.Data.SQLite e permitiu que ele também fosse portado para o .NET Core. O objetivo original de Microsoft.Data.Sqlite de ser leve e moderno, no entanto, ainda permanece. Confira Limitações do ADO.NET para saber mais sobre as APIs do ADO.NET não implementadas pelo Microsoft.Data.Sqlite.
Quando novos recursos são adicionados a Microsoft.Data.Sqlite, o design de System.Data.SQLite é levado em conta. Tentamos, sempre que possível, minimizar as alterações entre os dois para facilitar a transição entre eles.
Tipos de dados
A maior diferença entre Microsoft.Data.Sqlite e System.Data.SQLite é como os tipos de dados são tratados. Conforme descrito em Tipos de dados, Microsoft.Data.Sqlite não tenta ocultar a peculiaridade subjacente do SQLite, que permite que qualquer cadeia de caracteres arbitrária seja especificada como o tipo de coluna e tem apenas quatro tipos primitivos: INTEGER, REAL, TEXT e BLOB.
System.Data.SQLite aplica semântica adicional a tipos de coluna mapeando-os diretamente para tipos do .NET. Isso dá ao provedor uma sensação mais fortemente tipada, mas não é completamente adequado. Por exemplo, foi preciso introduzir uma nova instrução SQL (TYPES) para especificar os tipos de coluna de expressões em instruções SELECT.
Cadeias de conexão
Microsoft.Data.Sqlite tem muito menos palavras-chave de cadeia de conexão. A tabela a seguir mostra alternativas que podem ser usadas.
Palavra-chave | Alternativa |
---|---|
Tamanho do cache | Enviar PRAGMA cache_size = <pages> |
FailIfMissing | Use Mode=ReadWrite . |
FullUri | Usar a palavra-chave Fonte de Dados |
Modo de diário | Enviar PRAGMA journal_mode = <mode> |
Formato herdado | Enviar PRAGMA legacy_file_format = 1 |
Contagem máxima de páginas | Enviar PRAGMA max_page_count = <pages> |
Tamanho da Página | Enviar PRAGMA page_size = <bytes> |
Somente leitura | Use Mode=ReadOnly . |
Síncrono | Enviar PRAGMA synchronous = <mode> |
Uri | Usar a palavra-chave Fonte de Dados |
UseUTF16Encoding | Enviar PRAGMA encoding = 'UTF-16' |
Autorização
Microsoft.Data.Sqlite não tem nenhuma API que exponha o retorno de chamada de autorização do SQLite. Use o problema nº 13835 para fornecer comentários sobre esse recurso.
Notificações de alteração de dados
Microsoft.Data.Sqlite não tem nenhuma API que exponha as notificações de alteração de dados do SQLite. Use o problema nº 13827 para fornecer comentários sobre esse recurso.
Módulos de tabela virtual
Microsoft.Data.Sqlite não tem nenhuma API para criar módulos de tabela virtual. Use o problema nº 13823 para fornecer comentários sobre esse recurso.