Информационные технологииStfw.Ru 🔍

Строим независимые от конкретной БД приложения ASP.NET

ASP.NET
🕛 06.12.2006, 14:11
Почему Mimer Provider Manager?
Когда вы разрабатываете приложения, использующие базы данных с помощью технологии ADO.NET, то вы используете поставщики данных для разных БД. Такой подход не позволяет писать приложения, независимые от БД. Система Mimer Provider Manager позволяет строить эффективные приложения, которые могут работать с различными базами данных без изменения кода. Mimer Provider Manager использует унифицированный интерфейс, инкапсулирующий работу с БД различных поставщиков, позволяя строить гибкие приложения для работы с БД.

Mpm использует различные плагины для доступа к различным провайдерам ADO.NET. С точки зрения приложения Mpm является просто ещё одним поставщиком данных ADO.NET, так что свою программу можно разрабатывать привычным способом. На данный момент плагины разработаны для Oracle, SQL Server, Mimer SQL, Odbc, и OleDb. Есть также общий плагин, поддерживающий любого провайдера, используя отражение, правда из-за этого он немного медленнее работает.
Фильтры SQL - это другая интересная особенность Mpm. Эта технология позволяет вам писать фильтры, которые модифицируют SQL-запрос, отсылаемый базе данных. Таким образом можно выполнять автоматическую конвертацию между различными диалектами SQL, чем достигается настоящая независимость от БД. Фильтр, поддерживающий различные типы параметров, поставляется с Mpm, а также вы легко можете написать свои собственные фильтры.
Mpm следует схеме именования ADO.NET. Например, для создания соединения используется класс MpmConnection. Это означает, что для конвертации существующей системы для поддержки Mpm необходимо всего лишь заменить поставщик данных.
Определения источников данных, плагинов и фильтров SQL могут храниться в конфигурационном файле и поставляться с приложением, так что вам не придётся ничего конфигурировать на клиенте. Также эти конфигурационные данные можно хранить в реестре. Сборки Mpm устанавливаются в Global Assembly Cache (GAC), но можно их устанавливать в каталог вашего приложения и использовать их вне зависимости от наличия в GAC.
Mpm включает Mimer Provider Manager Administrator, который может быть использован для определения источников данных, доступных приложению. А поскольку в приложении вы указываете только имя источника данных, то переключать БД можно на лету - не затрагивая кода приложения. Этот Администратор можно использовать также для того, чтобы сообщить системе, какой из фильтров SQL вы собираетесь использовать и какие плагины загружать. Другими словами, вам ничего не нужно менять в коде для того, чтобы сменить фильтр, конвертирующий ваши запросы к Microsoft SQL Server на запросы к Oracle или в запросы ANSI SQL. Кроме редактирования глобальных настроек Mpm, вы можете создавать и редактировать конфигурационные файлы, специфичные для вашего приложения, включая web.config. Секция Mpm будет создана для вас в этих файлах, если она там ещё не существует. Mimer Provider Manager Administrator широко поддерживает технологию «перетащи и брось». Это означает, что можно легко переключаться от использования глобальной конфигурации к локальной, используя два экземпляра Администратора, один с глобальной, а другой - с локальной конфигурациями и просто перетаскивать между ними плагины, фильтры и источники данных.
Mimer Provider Manager Administrator упрощает построение строк соединений путём использования Сетки свойств. Ваша строка строится путём выбора соответствующих настроек из ниспадающих списков. При смене БД настройки будут автоматически конвертироваться к синтаксису нового поставщика данных.
Mpm интегрирован в Visual Studio .NET, так что вы можете перетаскивать MpmCommands, MpmConnections и т.п. на ваши формы. Документация также интегрирована, поэтому с ней можно ознакомиться как с любой стандартной документацией компании Microsoft, включая динамическую помощь. Также присутствует механизм, разработанный для генерации новых плагинов. Он исполнен в виде волшебника Visual Studio .NET. Mpm поддерживает концепцию выполнения «бок-о-бок», так что несколько разных версий системы могут быть установлены на один компьютер и исполняться параллельно.

Браузер БД в виде веб-риложения

Для демонстрации работы с Mpm мы разработали небольшое веб-приложение ASP.NET, использующее Mpm. В этом приложении вы можете выбрать источник данных и просмотреть существующие таблицы. Приложение разработано с помощью языка C#. Архитектура ADO.NET позволяет вам работать с БД в подсоединённом состоянии, либо в отсоединённом. В подсоединённой модели поставщик данных используется для соединения с БД, выполнения команд и получения результатов. В отсоединённой модели используется DataAdapter. Мы также будем выполнять всю работу в основном с его помощью. Однако, мы будем использовать MpmCommand и MpmDataReader для получения списка таблиц БД. Важной частью пользовательского интерфейса являются два ниспадающих списка DropDownLists и одна сетка данных DataGrid.

Для заполнения ниспадающего списка именами БД мы используем класс Mimer.Mpm.Data.Extensions.MpmInfo:

private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
dropDownDataSource.DataSource = MpmInfo.DataSourceNames;
dropDownDataSource.DataBind();
}}

Класс MpmInfo используется для получения информации в режиме времени выполнения о системе Mpm, например такой, как доступные источники данных, фильтры SQL и плагины.

Когда источник данных выбирается в ниспадающем списке DropDownList, то вызывается метод dropDownDataSource_SelcectedIndexChanged(...). Он в свою очередь вызывает GetTables(string dataSoure) передавая в виде параметра выбранный источник данных. GetTables(...) получает все доступные таблицы в БД, используя стандартное представление INFORMATION_SCHEMA:

private void GetTables(string dataSource)
{
MpmCommand tableCommand = null;
MpmConnection mpmConnection = new MpmConnection("Data Source Name=" + dataSource);
MpmDataReader reader = null;
dropDownTables.Items.Clear();
try
{
if(mpmConnection.DataSourceDescriptor.DbmsType == MpmDbmsTypes.Oracle)
{
throw new NotSupportedException("Oracle does not have INFORMATION_SCHEMA by default");
}
mpmConnection.Open();
tableCommand = mpmConnection.CreateCommand();
tableCommand.CommandText = "select table_schema, table_name from information_schema.tables where table_type='BASE TABLE'";
reader = tableCommand.ExecuteReader();
ListItem li;
while(reader.Read())
{
li = new ListItem(reader.GetString(0) + "." + reader.GetString (1), "\"" + reader.GetString(0) + "\"." + "\"" + reader.GetString(1) + "\"");
dropDownTables.Items.Add(li);
}
}
catch(MpmException mex)
{
//Handle the error
throw mex;
}
finally
{
if(reader != null)
{
reader.Close();
}
if(mpmConnection.State != ConnectionState.Closed)
{
mpmConnection.Close();
}}}

Как вы видите, составные, использующие ADO.NET, такие же, как и при использовании любого другого поставщика данных, единственное отличие - упрощенная строка соединения и схема наименования Mpm.

Код, приведенный выше, заполняет ниспадающий список доступными таблицами когда одна из них выбрана, вызывает метод dropDownTables_SelectedIndexChanged(...). Этот метод вызывает LoadDataSet(string tableName), который строит DataSet, а мы её привязываем к нашей сетке данных DataGrid:

private void dropDownTables_SelectedIndexChanged(object sender, System.EventArgs e)
{
if(dropDownDataSource.SelectedItem.ToString() != "" && dropDownTables.SelectedItem.ToString() != "")
{
LoadDataSet(dropDownTables.SelectedItem.Value);
DataSet ds = (DataSet)Session["ds"];
Session["tableName"] = dropDownTables.SelectedItem.Value;
dataGrid.DataSource = ds.Tables[Session["tableName"].ToString()].DefaultView;
dataGrid.Enabled=true;
dataGrid.CurrentPageIndex = 0;
dataGrid.DataBind();
dataGrid.Visible = true;
} }

private void LoadDataSet( string tableName)
{
try
{
StringBuilder selCmd = new StringBuilder();
string conStr = "Data Source Name=" + dropDownDataSource.SelectedItem.ToString();
MpmConnection mpmConnection = new MpmConnection(conStr);
selCmd.Append("select * from ");
selCmd.Append(tableName);
MpmDataAdapter mpmDataAdapter = new MpmDataAdapter(selCmd.ToString(), mpmConnection);
DataSet ds = new DataSet();
mpmDataAdapter.Fill(ds, tableName);
Session["ds"] = ds;
}
catch(MpmException mex)
{
//Handle the error
throw mex;
} }

Итоговый набор данных DataSet хранится в сессии пользователя, поскольку в приложении мы поддерживаем разбиение на страницы. Вместо пересоздания DataSet из БД мы просто берём её из сессии пользователя. Это конечно не лучшее решение при большом количестве пользователей и больших таблицах, поскольку потребует большого объёма памяти. Поэтому альтернативно можно использовать метод mpmDataAdapter.Fill(ds, startRecord, maxRecords, tableName).

Несколько строк кода, которые мы здесь показали, и используются для работы с БД в приложении-примере. И этого вполне достаточно для построения браузера баз данных, способного просматривать любую доступную на сервере таблицу.

ASP   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉