Как наследовать System.Data.SQLite в C#

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

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


person Eduardo    schedule 19.01.2010    source источник


Ответы (2)


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

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

person Samuel Neff    schedule 26.01.2010

Это отличный вопрос, и спустя 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);
    }
  }
}
person IVSoftware    schedule 14.02.2017