Упрощаем себе жизнь 2 (Postgresql + asp.net)

от автора

Чуть более года назад, стояла задача написания 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(WRKDataBase.mkNauka);             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> 

P\S класс прослойки выложу как только будет возможность.

ссылка на оригинал статьи http://habrahabr.ru/post/215999/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *