Condividi tramite


Confronto con System.Data.SQLite

Nel 2005 Robert Simpson ha creato System.Data.SQLite, un provider SQLite per ADO.NET 2.0. Nel 2010 il team di SQLite ha assunto la manutenzione e lo sviluppo del progetto. Vale anche la pena notare che nel 2007 il team di Mono ha creato una copia tramite fork del codice come Mono.Data.Sqlite. La libreria System.Data.SQLite ha una lunga storia e si è evoluta in un provider di ADO.NET stabile e con funzionalità complete con gli strumenti di Visual Studio. Le nuove versioni continuano a distribuire assembly compatibili con ogni versione di .NET Framework, a partire dalla versione 2.0 e persino da .NET Compact Framework 3.5.

La prima versione di .NET Core (rilasciata nel 2016) è stata un'implementazione singola, leggera, moderna e multipiattaforma di .NET. Le API obsolete e le API con alternative più moderne sono state rimosse intenzionalmente. ADO.NET non includeva alcuna API DataSet, ad esempio DataTable e DataAdapter.

Il team di Entity Framework aveva familiarità con la codebase di System.Data.SQLite. Brice Lambson, membro del team di Entity Framework, aveva precedentemente aiutato il team di SQLite ad aggiungere supporto per Entity Framework versioni 5 e 6. Brice stava anche sperimentando con la propria implementazione di un provider di ADO.NET per SQLite nello stesso periodo in cui era in corso la pianificazione di .NET Core. Dopo una lunga discussione, il team di Entity Framework ha deciso di creare Microsoft.Data.Sqlite in base al prototipo di Brice. Questo approccio avrebbe consentito loro di creare una nuova implementazione leggera e moderna che si sarebbe allineata agli obiettivi di .NET Core.

Per illustrare cosa si intende per più moderno, ecco il codice per creare una funzione definita dall'utente sia in System.Data.SQLite sia in 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));

Nel 2017 si è verificato un cambiamento di strategia per .NET Core 2.0. È stato deciso che la compatibilità con .NET Framework era fondamentale per il successo di .NET Core. Molte delle API rimosse, incluse le API DataSet, sono state aggiunte di nuovo. Analogamente a molti altri casi, questa scelta ha consentito di sbloccare System.Data.SQLite, permettendone anche il trasferimento in .NET Core. L'obiettivo originale della libreria Microsoft.Data.Sqlite, ovvero essere moderna e leggera, rimane tuttavia invariato. Per informazioni dettagliate sulle API ADO.NET non implementate da Microsoft.Data.Sqlite, vedere Limitazioni di ADO.NET.

Quando vengono aggiunte nuove funzionalità a Microsoft.Data.Sqlite, viene presa in considerazione la struttura di System.Data.SQLite. Si prova a ridurre al minimo le modifiche tra le due, quando possibile, per facilitare la transizione.

Tipo di dati

La differenza principale tra Microsoft.Data.Sqlite e System.Data.SQLite è la modalità di gestione dei tipi di dati. Come descritto in Tipi di dati, Microsoft.Data.Sqlite non prova a nascondere l'eccentricità sottostante di SQLite, che consente di specificare qualsiasi stringa arbitraria come tipo di colonna e ha solo quattro tipi primitivi: INTEGER, REAL, TEXT e BLOB.

System.Data.SQLite applica una semantica aggiuntiva ai tipi di colonna eseguendone il mapping direttamente ai tipi .NET. In questo modo il provider ha un aspetto più fortemente tipizzato, ma presenta alcune complessità. È stato ad esempio necessario introdurre una nuova istruzione SQL (TYPES) per specificare i tipi di colonna di espressioni nelle istruzioni SELECT.

Stringhe di connessione

Microsoft.Data.Sqlite include molte meno parole chiave per la stringa di connessione. Nella tabella seguente sono illustrate le alternative che è possibile usare.

Parola chiave Alternativa
Dimensioni cache Inviare PRAGMA cache_size = <pages>
FailIfMissing Utilizzare Mode=ReadWrite.
FullUri Usare la parola chiave Origine dati
Modalità Journal Inviare PRAGMA journal_mode = <mode>
Formato legacy Inviare PRAGMA legacy_file_format = 1
Numero massimo di pagine Inviare PRAGMA max_page_count = <pages>
Dimensioni pagina Inviare PRAGMA page_size = <bytes>
Sola lettura Utilizzare Mode=ReadOnly.
Sincrona Inviare PRAGMA synchronous = <mode>
URI Usare la parola chiave Origine dati
UseUTF16Encoding Inviare PRAGMA encoding = 'UTF-16'

Autorizzazione

Microsoft.Data.Sqlite non ha alcuna API che espone il callback di autorizzazione di SQLite. Usare il problema #13835 per fornire feedback su questa funzionalità.

Notifiche di modifica dei dati

Microsoft.Data.Sqlite non ha alcuna API che espone le notifiche di modifica dei dati di SQLite. Usare il problema #13827 per fornire feedback su questa funzionalità.

Moduli di tabella virtuale

Microsoft.Data.Sqlite non ha alcuna API per la creazione di moduli di tabella virtuale. Usare il problema #13823 per fornire feedback su questa funzionalità.

Vedi anche