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