Облегчаем себе жизнь 2 (Postgresql + asp.net)

в 14:32, , рубрики: .net, c#.net, postgresql, метки: ,

Чуть более года назад, стояла задача написания web приложения работающая с БД Postgresql. К моему сожалению, стандартного адаптера для работы с БД PostgreSQL не было, а с тем, что был найден на просторах интернета ( бесплатный ) работать было не возможно.
В итоге было решено обойтись библиотекой Npgsql.
Как работать с этой библиотекой, есть документация и множество примеров в интернете. Сразу же после начала работы с ней, мне не понравилось, что нужно много писать однотипного кода. Для облегчения работы была создана дополнительная прослойка в виде отдельного класса, для работы с БД через данную библиотеку.

Особенности:
1. данные для подключения берутся с файла web.config
2. есть возможность для работы с несколькими подключениями. ( например если у проекта модульная система, и каждый модуль работает только со своей схемой )

пример части из web.config

  <appSettings>
    <!-- Подключение к БД -->
    <add key="ProviderName" value="PostgreSQL" />
    <add key="DataBase" value="DataBaseName" />
    <add key="Port" value="80" />
    <add key="Host" value="DataBaseHost" />
    <!-- Данные подключения к БД для ядра  системы -->
    <add key="UserName0" value="UserNameCore" />
    <add key="Password0" value="PasswordCore" />
    <add key="Schema0" value="SchemaCore" />
    <!-- Данные подключения к БД для 1го модуля системы -->
    <add key="UserName1" value="UserNameModule1" />
    <add key="Password1" value="PasswordModule1" />
    <add key="Schema1" value="SchemaModule1" />
  </appSettings>

в отдельном классе так же можно объявить константы, для дальнейшего удобства

        public static int mkCore = 0;
        public static int mkModule1 = 1;

публичные методы класса WRKDataBase

         public WRKDataBase(int module)   // инициализация класса
         public bool Connected()                     // проверка, есть ли у экземпляра класса подключение к БД
         public NpgsqlConnection CreateConnection()   // создаем подключение к БД
         public DbCommand CreateCommand(string SQLString)  //создаем "команду"
         private bool RepairCommand(DbCommand Command, string SQLString)  // если "команда" есть, то присваиваем новый запрос иначе создается
         public void AddCommandParam(ref DbCommand Command, string Param_name, object Param_value, DbType Type)   //добавляем параметр к "команде"
         public void AddCommandParamNull(ref DbCommand Command, string Param_name)  // добавляет параметр со значением NULL
         public bool CommandExecute(string SQLString="")   // выполнение sql запроса
         public bool CommandExecute(DbCommand Command)  // выполнение "команды"   
         public DbDataReader CreateReader(string SQLString)  //создание "ридера" по sql запросу
         public DbDataReader CreateReader(DbCommand Command)  // создание "ридера" по "команде"
         public DbDataAdapter CreateDataAdapter(string SQLString)  // создание "адаптера", по SQL запросу
         public bool UpdateAdapter(ref DbDataAdapter dbDataAdapter, DataSet dataSet)  //обновить данные в "адаптере" из "датасета"
         public void AddCommandToAdapter( DbDataAdapter datadapter, DbCommand Command, string action )  //добавление "команды" "адаптеру"
         public bool CreateDataSet(DataSet Dataset, string SQLString)  // создание датасета из результата sql запроса
         public bool FillDataSet(ref DataSet dataSet, string SQLString, string datasetTableName) // заполняет "датасет" результатом sql запроса
         public void Dispose()  // уничтожение класса
 

в SQL запросах наименование таблиц, вьюшек, функций и т.д. нужно оборачивать в "~", напрмер

 Select id, name from ~years~

тогда для подключения к ядру системы будет достаточно

            WRKDataBase wrkDataBase  = new WRKDataBase("допклассконстантами".mkCore);

для работы правда уже исползуем не DataSource, а ObjectDataSource. ( Описние ObjectDataSource на msdn )

Пример:
класс описания объекта

    public class sYear
    {
        public string god { get; set; }
        public string naimen { get; set; }

        public sYear(IDataRecord rec)
        {
            if (rec["god"] != null) { god = rec["god"].ToString(); };
            if (rec["naimen"] != null) { naimen = rec["naimen"].ToString(); };
        }

        public sYear(string pgod, string pnaimen)
        {
            god = pgod;
            naimen = pnaimen;
        }
    }

класс работы с БД

    public class sYearDB
    {
        public List<sYear> SelectListYear()
        {
            WRKDataBase wrkDataBase;
            wrkDataBase = new WRKDataBase("допклассконстантами".mkModule1);
            List<sYear> ret = new List<sYear>();
            ret.Add(new sYear("0", "Все"));
                var rdr = wrkDataBase.CreateReader("Select god, god as naimen from ~vyear~ order by god");
                while (rdr.Read())
                    ret.Add(new sYear(rdr));
                rdr.Close();
            wrkDataBase.Dispose();
            return ret;
        }
    }

датасорс:

    <asp:ObjectDataSource ID="dsYear" runat="server" SelectMethod="SelectListYear"
            TypeName="DBNameSpace.sYearDB" 
            DataObjectTypeName="DBNameSpace.sYear">
    </asp:ObjectDataSource>

UPD: Обещанная ссылка на класс

Автор: Radli007

Источник



https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js