2010-01-19 4 views
3

Я использую System.Data.SQLite и C# для доступа к базам данных/таблицам SQLite. Для ленивых и быстрых причин разработки я создал свою собственную библиотеку классов, чтобы инкапсулировать некоторые из методов System.Data.SQLite одним методом и создать множество общих подпрограмм (методов) базы данных, которые позволяют мне уменьшить мою работу при доступе к данным.Как наследовать System.Data.SQLite в C#

Если бы я наследовал библиотеку System.Data.SQLite вместо ссылки, это помогло бы мне оптимизировать мою работу, возможно ли это? Может, вы можете привести пример, пожалуйста?

ответ

1

Возможно наследование от SQLite и внесение дополнений в некоторые из классов, в частности SQLiteConnection. Тем не менее, вы не сможете использовать свои собственные классы везде, так как SQLite будет внутренне создавать множество классов, таких как SQLiteCommand и SQLiteParameter, и у вас нет возможности рассказать SQLite о том, как использовать ваши собственные версии. Существует SQLiteFactory, но он используется для интеграции поставщика данных ADO.NET и не используется внутри SQLite.

Вам намного лучше держать свои методы в отдельности. Если вы хотите, чтобы они чувствовали себя частью библиотеки, вы можете использовать Extension Methods

0

Это отличный вопрос, и я не нашел много ответов на вопросы через 7 лет! Я просто должен был сделать простой наследование и нашел это немного сложным (потому что я не был полностью знаком с ограничением родового типа). Но вот что я в итоге сработал.

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); 
    } 
    } 
} 
Смежные вопросы