Как наследовать System.Data.SQLite в C # - PullRequest
3 голосов
/ 19 января 2010

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

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

Ответы [ 2 ]

1 голос
/ 26 января 2010

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

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

0 голосов
/ 15 февраля 2017

Это отличный вопрос, и я не нашел много ответов на 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);
    }
  }
}
...