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 SQLite ha assunto la manutenzione e lo sviluppo del progetto. Vale anche la pena notare che il team Mono ha forcato il codice nel 2007 come Mono.Data.Sqlite. System.Data.SQLite ha una lunga storia e si è evoluta in un provider di ADO.NET stabile e completo con il supporto degli strumenti di Visual Studio. Le nuove versioni continuano a rilasciare assembly compatibili con tutte le versioni di .NET Framework fino alla versione 2.0 e persino al .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 e le API obsolete con alternative più moderne sono state rimosse intenzionalmente. ADO.NET non includeva alcuna API DataSet (inclusi DataTable e DataAdapter).

Il team di Entity Framework aveva familiarità con la codebase System.Data.SQLite. Brice Lambson, ex membro del team EF, aveva precedentemente aiutato il team SQLite ad aggiungere supporto per Entity Framework versioni 5 e 6. Brice stava anche sperimentando la propria implementazione di un provider di ADO.NET SQLite nello stesso tempo 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. Ciò consentirebbe loro di creare una nuova implementazione leggera e moderna che sarebbe allineata agli obiettivi di .NET Core.

Come esempio di ciò che si intende per più moderno, ecco il codice per creare una funzione definita dall'utente sia in System.Data.SQLite che 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, .NET Core 2.0 ha subito un cambiamento nella strategia. È 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. Come è avvenuto per molti altri, questo ha sbloccato System.Data.SQLite, consentendo anche di portarlo su .NET Core. L'obiettivo originale di Microsoft.Data.Sqlite di rimanere leggero e moderno, tuttavia, permane. Per informazioni dettagliate sulle API ADO.NET non implementate da Microsoft.Data.Sqlite, vedere ADO.NET limitazioni.

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

Tipi 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 cerca di nascondere la particolarità di SQLite, che permette di specificare qualsiasi stringa 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 che li mappano direttamente ai tipi .NET. In questo modo il provider ha un aspetto più fortemente tipizzato, ma ha alcune imperfezioni. Ad esempio, hanno dovuto introdurre una nuova istruzione SQL (TYPES) per specificare i tipi di colonna di espressioni nelle istruzioni SELECT.

Stringhe di connessione

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

Parola chiave Alternativa
Dimensione della cache Invia PRAGMA cache_size = <pages>
ErroreSeManca Usare Mode=ReadWrite
FullUri Usare la parola chiave Origine dati
Modalità journal Invia PRAGMA journal_mode = <mode>
Formato storico Invia PRAGMA legacy_file_format = 1
Numero massimo di pagine Invia PRAGMA max_page_count = <pages>
Dimensioni pagina Invia PRAGMA page_size = <bytes>
Sola lettura Usare Mode=ReadOnly
Sincrono Invia PRAGMA synchronous = <mode>
Uri Usare la parola chiave Origine dati
UseUTF16Encoding Invia PRAGMA encoding = 'UTF-16'

Autorizzazione

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

Notifiche di modifica dei dati

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

Moduli di tabella virtuale

Microsoft.Data.Sqlite non dispone di alcuna API per la creazione di moduli di tabella virtuale. Utilizzare l'elemento #13823 per fornire feedback su questa funzionalità.

Vedere anche