В итоге было решено обойтись библиотекой 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/
Добавить комментарий