2010-01-19 13 views
3

J'utilise System.Data.SQLite et C# pour accéder aux bases de données/tables SQLite. Pour des raisons de développement paresseux et rapide, j'ai créé ma propre bibliothèque de classes pour encapsuler certaines méthodes System.Data.SQLite dans une méthode et créer de nombreuses routines de base de données communes (méthodes) qui me permettent de réduire mon travail lors de l'accès aux données.Comment hériter System.Data.SQLite en C#

Si j'héritais de la librairie System.Data.SQLite au lieu de référencer cela m'aiderait à optimiser mon travail, c'est possible? Pouvez-vous donner un exemple, s'il vous plaît?

Répondre

1

Il est possible d'hériter de SQLite et de faire des ajouts à certaines classes, en particulier SQLiteConnection. Cependant, vous ne pourrez pas utiliser vos propres classes partout dans le monde car SQLite créera en interne de nombreuses classes telles que SQLiteCommand et SQLiteParameter et vous n'aurez pas l'option d'indiquer à SQLite d'utiliser vos versions personnalisées. SQLiteFactory est utilisé, mais il est utilisé pour l'intégration du fournisseur de données ADO.NET et n'est pas utilisé en interne par SQLite.

Il vaudrait mieux garder vos méthodes séparées. Si vous voulez qu'ils se sentent comme ils font partie de la bibliothèque, vous pouvez utiliser Extension Methods

0

Ceci est une excellente question et je n'ai pas trouvé beaucoup de réponses 7 ans plus tard! Je devais juste faire un héritage simple et je l'ai trouvé un peu compliqué (parce que je n'étais pas complètement familier avec la contrainte d'un type générique). Mais voici ce que j'ai fini avec qui a fonctionné.

using SQLite; // Here using sqlite-net-pcl 
using System.Collections.Generic; 

namespace SQLiteEx 
{ 
    class SQLiteConnection : SQLite.SQLiteConnection 
    { 
    // Must provide a constructor with at least 1 argument 
    public SQLiteConnection(string path) 
     : base(path) 
    { 
    } 

    // With this class, you can automatically append 
    // some kind of global filter like LIMIT 1000 
    string mGlobalFilter = ""; 
    public string GlobalFilter 
    { 
     set { mGlobalFilter = value; } 
     get { return string.IsNullOrWhiteSpace(mGlobalFilter) ? "" : " " + mGlobalFilter; } 
    } 

    // You MUST constrain the generic type with "where T : new()" 
    // OTHERWISE feel the wrath of: 
    // =================================================================== 
    // 'T' must be a non-abstract type with a public parameterless 
    // constructor in order to use it as parameter 'T' in the generic 
    // type or method 'SQLiteConnection.Query<T>(string, params object[])' 
    // =================================================================== 
    public List<T> Query<T>(string sql) where T : new() 
    { 
     return base.Query<T>(sql + GlobalFilter); 
    } 
    } 
}