Comparación con System.Data.SQLite
En 2005, Robert Simpson creó System.Data.SQLite, un proveedor de SQLite para ADO.NET 2.0. En 2010, el equipo de SQLite se apoderó del mantenimiento y desarrollo del proyecto. También merece la pena mencionar que el equipo de Mono bifurcó el código en 2007 como Mono.Data.Sqlite. System.Data.SQLite tiene un largo historial y ha evolucionado en un proveedor de ADO.NET estable y completo con herramientas de Visual Studio. Las nuevas versiones continúan suministrando ensamblados compatibles con cada versión de .NET Framework hasta la versión 2.0 e incluso con .NET Compact Framework 3.5.
La primera versión de .NET Core (publicada en 2016) era una implementación única, ligera, moderna y multiplataforma de .NET. Las API obsoletas y las API con alternativas más modernas se quitaron intencionadamente. ADO.NET no incluía ninguna de las API de DataSet (incluidas DataTable y DataAdapter).
El equipo de Entity Framework estaba algo familiarizado con el código base System.Data.SQLite. Brice Lambson, un antiguo miembro del equipo de EF, había ayudado anteriormente al equipo de SQLite a agregar compatibilidad con las versiones 5 y 6 de Entity Framework. Brice también experimentaba con su propia implementación de un proveedor de ADO.NET SQLite aproximadamente al mismo tiempo que se planeaba .NET Core. Después de una larga discusión, el equipo de Entity Framework decidió crear Microsoft.Data.Sqlite basado en el prototipo de Brice. Esto les permitiría crear una implementación ligera y moderna que se alinearía con los objetivos de .NET Core.
Como ejemplo de lo que queremos decir más moderno, este es el código para crear una función definida por el usuario en System.Data.SQLite y 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));
En 2017, .NET Core 2.0 experimentó un cambio en la estrategia. Se decidió que la compatibilidad con .NET Framework era fundamental para el éxito de .NET Core. Muchas de las API eliminadas, incluidas las API de DataSet, se agregaron de nuevo. Al igual que para muchos otros, esto desbloqueó System.Data.SQLite, permitiéndole también ser migrado a .NET Core. Si bien, el objetivo original de Microsoft.Data.Sqlite de que fuera ligero y moderno sigue vigente. Consulte ADO.NET limitaciones para obtener más información sobre las API de ADO.NET no implementadas por Microsoft.Data.Sqlite.
Cuando se agregan nuevas características a Microsoft.Data.Sqlite, se tiene en cuenta el diseño de System.Data.SQLite. Intentamos, cuando sea posible, minimizar los cambios entre los dos para facilitar la transición entre ellos.
Tipos de datos
La mayor diferencia entre Microsoft.Data.Sqlite y System.Data.SQLite es cómo se controlan los tipos de datos. Como se describe en Tipos de datos, Microsoft.Data.Sqlite no intenta ocultar la peculiaridad subyacente de SQLite, que permite especificar cualquier cadena arbitraria como el tipo de columna y solo tiene cuatro tipos primitivos: INTEGER, REAL, TEXT y BLOB.
System.Data.SQLite aplica semántica adicional a los tipos de columna que se asignan directamente a los tipos de .NET. Esto proporciona al proveedor una mayor sensación de fuertemente tipado, pero tiene algunas asperezas. Por ejemplo, tenían que introducir una nueva instrucción SQL (TYPES) para especificar los tipos de columna de expresiones en instrucciones SELECT.
Cadenas de conexión
Microsoft.Data.Sqlite tiene muchas menos palabras clave de cadena de conexión. En la tabla siguiente se muestran alternativas que se pueden usar en su lugar.
Palabra clave | Alternativo |
---|---|
Tamaño de caché | Enviar PRAGMA cache_size = <pages> |
FailIfMissing | Use Mode=ReadWrite |
FullUri | Usar la palabra clave de origen de datos |
Modo diario | Enviar PRAGMA journal_mode = <mode> |
Formato heredado | Enviar PRAGMA legacy_file_format = 1 |
Número máximo de páginas | Enviar PRAGMA max_page_count = <pages> |
Tamaño de página | Enviar PRAGMA page_size = <bytes> |
Solo lectura | Use Mode=ReadOnly |
Síncrono | Enviar PRAGMA synchronous = <mode> |
Identificador URI | Utilice la palabra clave Origen de datos |
UseUTF16Encoding | Enviar PRAGMA encoding = 'UTF-16' |
Autorización
Microsoft.Data.Sqlite no tiene ninguna API que exponga la devolución de llamada de autorización de SQLite. Utilice la incidencia #13835 para proporcionar comentarios sobre esta característica.
Notificaciones de cambio de datos
Microsoft.Data.Sqlite no tiene ninguna API que exponga las notificaciones de cambio de datos de SQLite. Use el problema #13827 para proporcionar comentarios sobre esta característica.
Módulos de tabla virtual
Microsoft.Data.Sqlite no tiene ninguna API para crear módulos de tabla virtual. Use el problema #13823 para proporcionar comentarios sobre esta característica.