Asp компонент доступа к базам данных


Содержание

Asp компонент доступа к базам данных

Обновлен: Ноябрь 2007

В состав платформы ASP.NET входят функции, позволяющие добавить доступ к данным на веб-страницах ASP.NET с написанием минимально необходимого программного кода или вовсе без него. В качестве источников данных можно использовать базы данных, данные и файлы XML, а также бизнес-объекты. Затем данные можно отобразить на странице с помощью разнообразных элементов управления, обеспечивающих широкие возможности представления данных на странице. В ходе знакомства с сопутствующими разделами документации рекомендуется соблюдать приведенную ниже последовательность.

Приступая к работе

Общие сведения о серверных веб-элементах управления ASP.NET, предназначенных для соединения с источниками данных, а также для отображения и изменения данных на веб-страницах.

Сведения о настройке, управлении, подключении и развертывании баз данных экспресс-выпуска SQL Server.

Сведения об элементах управления ASP.NET, позволяющих предоставить доступ к данным другим элементам управления.

Сведения об элементах управления, позволяющих отображать данные на веб-странице.

Использование платформы динамических данных

Общие сведения о платформе динамических данных ASP.NET.

Сведения о структуре файлов и каталогов, настройке конфигурации, а также регистрации модели данных.

Описание механизма формирования шаблонов — средства создания страниц на основе базы данных. Страницы создаются автоматически с использованием шаблонов по умолчанию как для страниц, так и для полей данных.

Описание шаблонов полей — пользовательских элементов управления ASP.NET, определяющих отображаемый пользовательский интерфейс для различных типов данных в модели данных.

Использование средства LINQ

Общие сведения о LINQ.

Сведения о способах использования LINQ в веб-приложении ASP.NET.

Сведения об элементах управления, которые позволяют разработчикам веб-страниц использовать LINQ с помощью архитектуры элементов управления источников данных ASP.NET.

Сведения о проблемах безопасности, связанных с доступом к данным на веб-узлах.

Инструкции по шифрованию строк соединения в файле Web.config.

Стратегии передачи учетных данных из веб-приложения в SQL Server.

Привязка к данным

Сведения о подключении к базам данных, таким как Microsoft SQL Server, Microsoft Access и др.

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

Сведения о подключении к нетабличным данным, таким как XML.

Сведения о задании привязки к данным программным способом в разметке страницы.

Построение ASP.NET-СИСТЕМЫ ДОСТУПА К БД

Создание СУБД ASP.NET -СИСТЕМЫ

Рассмотрим аспекты создания СУБД ASP.NET системы, и проектирование связи компонетнов системы.

Используется ASP.NET 2.0 элементы управления источником данных (Data Source) (Приложение А). Данные элементы являются набором элементов управления, разработанных для предоставления декларативного подхода к осуществлению доступа и изменению информации.

Для того, чтобы отобразить содержимое таблицы базы данных на вебстранице АРМ с ASP.NET , написан код для того, чтобы (Приложение А) .

В проектируемом АРМ на ASP.NET 2.0, информация может быть доступна полностью из декларативной разметки, доступ к информации базы данных, осуществленный посредством элементов управления SqlDataSource и AccessDataSource. Указываем запросу SELECT, что можно использовать любые параметры в выражении WHERE в качестве свойств элементов управления источником данных Data Source (Приложение А) .

Используем в разработке SqlDataSource — пригоден для доступа к информации любой реляционной базы данных. «Sql» в названии не имеет отношения к Microsoft SQL Server, скорее к синтаксису SQL относительно запросов к реляционным базам данных, так как элемент SqlDataSource использован для осуществления доступа к базам данных Microsoft SQL Server, Microsoft Access (Приложение А).

Используем в разработке АРМ компонент AccessDataSource — похож на SqlDataSource. Ключевой разницей является то, что вместо того чтобы требовать строку соединения к базе данных, элемент AccessDataSource позволяет вам просто указать путь к Access файлу .MDB посредством свойства DataFile.

ASP.NET 2.0 предоставляет каталог App_Data (Приложение Б, рис. Б.15) — чтобы хранить в нем XML-файлы, файлы базы данных Access (.mdb), файлы базы данных SQL Server(.mdf). ASP.NET может работать с базами данных которые не находятся в каталоге App_Data. Для того чтобы правильно осуществить доступ к данным, мы должны настроить некоторые свойства SqlDataSource, которые указывают используемую базу данных и запрос, который нужно выполнить. Хотя это можно осуществить посредством панели Properties, это выполняется быстрее, при помощи мастера , которую можно вызвать нажатием на ссылку в смарт-теге элемента SqlDataSource.

Проектирование интерфейса пользователя

Рассмотрим Аспекты проектирования пользовательского интерфейса. Программирование Web приложения проектируемого АРМ, с точки зрения повторного использования кода для построения пользовательского интерфейса (Приложение Б, рис. Б.16).

В проекте АРМ ASP.NET используем пользовательские серверные элементы управления. Компонент, реализующий серверный элемент управления запускается на Web сервере, и, в общем случае, не предъявляет каких-либо требований к клиенту. Собственные серверные элементы управления формируют представление от HTML, до использования сложных клиентских скриптов и XML. Комплексные объекты пользовательского интерфейса в виде отдельных Web форм и затем с минимальными усилиями преобразуем их в Web управление пользователя АРМ (Приложение Б, рис. Б.16) .

Помимо этих категорий в АРМ применяются термины для обозначения подкатегорий элементов управления, связанных с использованием некоторых возможностей инфрастуктуры страниц ASP.NET. Полный контроль над формой позволяют создавать элемент управления таким образом, что бы разработчик, использующий его на ASPX странице мог настраивать его представление через использование шаблонов. (Приложение Б, рис. Б.16)

Рисунок 4.1 Изображение интерфейса АРМ

Как видно из рисунка 4.1 упрощенный интерфейс сайта позволяет добиться максимального удобство в работе с АРМ, защищенности данных с помощью авторизации.

Файл базы данных diplombd и файл таблици стилей размещена в папке сервера App_Data. Картинки размещены в корневой папке сервера.Картинки были созданы стандартной программой MSPaint, с добавлением в них текста названий соответствующих разделов. Также были помещены 3 файла Microsoft Word соответствующей документации.

Далее были созданы файлы Default.aspx- Default40.aspx , в которых и происходит обработка данных и записаны все серверные команды ASP.NET.

ASPX-файл является, по сути, обычным HTML, в котором можно использовать специальные теги. Дополнитеьные теги делатся на две категории: служебные, задающие параметры страницы и позволяющие внедрять код, и теги контролов, которые представляют собой новые интерфейсные конструкции, настройка которых инкапсулирована в тег (Приложение А).

Базовой директивой является @ Page, которая описывает основные параметры страницы, такие как файл с исходным текстом, язык кода, параметры трассировки. Также используются директивы @ Import, @ Assembly, @ OutputCache .

Конструкция является аналогом для компонент с привязкой к данным. Они подставляют вместо себя значение, зависящее от текущего контекста данных.

Представления(View) создаются на основе одной или нескольких таблиц с помощью фильтрации, объединения, сортировки и группирования.

Для конфигурирования источников данных Control Panel, Administrative Tools, Data Sources(ODBC). ODBC при наличии нужного драйвера позволяет связываться с БД АРМ. В файле Excel создана именованная таблица, ODBC способен ее распознать и работать как с таблицей базы данных.

Веб-проект в Visual Studio содержит предопределенную папку App_Data. В ней хранятся файлы с данными, которые используются в приложении.

System.Data — это ядро АРМ. Оно содержит классы, необходимые для связи посредством любых провайдеров данных. Эти классы представляют таблицы, строки, столбцы, DataSet(множество взаимосвязанных таблиц). Там определены интерфейсы соединений с базами данных, команд, адаптеров данных (Приложение А). System.Data.Common — базовые классы для всех провайдеров данных — DbConnection, DbCommand, DbDataAdapter.В System.Data.OleDb находятся классы, позволяющие работать с источниками данных OleDb.

System.Data.SqlClient. Здесь определен провайдер данных для СУБД. Содержатся классы SqlConnection, SqlTransaction, SqlCommand (Приложение А).

Вначале создается соединение с базой данных — класс Connection, который обеспечивается необходимой информацией — строкой соединения.

Создается объект Command и задается команда, которую необходимо выполнить в данной СУБД. Если команда не возвращает данных, она просто выполняется с помощью одного из методов Execute.

Создаем класс DataAdapter и с его помощью сохранить данные в DataSet или в DataTable. Во втором случае создается класс DataReader, который требует сохранять соединение на все время работы, хранит выборку только для чтения и позволяет двигаться только вперед. Зато чтение с помощью DataReader выполняется в несколько раз быстрее, чем в DataAdapter(Приложение А).

DataSource Путь к базе данных в файловой системе при использовании Oledb, имя экземпляра базы сервера при использовании SqlConnection. Database Возвращает имя базы данных, используемой в объекте Connection после открытия.State Возвращает текущее состояние соединения. Возможные значения — Broken, Closed, Connecting, Executing, Fetching и Open (Приложение А).

Свойство CommandType может принимать значения из перечисления CommandType. По умолчанию это Text, то есть выполняется непосредственно текст команды SQL, который записан в свойстве Command. TableDirect означает, что в результате выполнения команды будет возвращено все содержание таблицы. StoredProcedure означает, что в Command находится имя процедуры сервера, которая и будет выполняться.

SelectCommand — эта команда используется для выборки данных из базы. При этом класс DataTable заполняется данными.

UpdateCommand — обновляет данные(редактирование записей).

InsertCommand — добавление новых записей (Приложение А).

Основываясь на таблицах датасета, создаем представления — DataView.

— создаение БД. В окне Server Exlorer нажатие правой клавишей мыши на пункт Data Connections, в контекстном меню выбран Create New Sql Database.

— SQLExpress равносильно (local) SQLExpress и означает сервер на локальной машине. Создали базу данных Polls, которая находится на сервере.

— Создание таблицы через окно Server Exlorer. Там уже появился узел созданной базы Polls.dbo. Правой клавишей мыши нажатие на пункт Tables, в контекстном меню выбор Add New Table. Заполнены следующие значения.Column Name .

Оператор SELECT извлекает записи из таблицы poll, которые соответствуют условию после ключевого слова WHERE. Так как id — ключевое(уникальное) поле и выбирается одно поле voices, возвращается одно значение, которое можно записать в переменную. Затем в операторе UPDATE изменяется на увеличенное значение переменной @Count(Приложение А).

Создание модуля Visual Basic for Applications обработки данных Excel

Рассмотрим созданиее модуля Visual Basic for Applications обработки данных Excel (Приложение А).

Visual Basic for Applications (VBA, Visual Basic для приложений) немного упрощённая реализация языка программирования Visual Basic. VBA покрывает и расширяет функциональность ранее использовавшихся специализированных макро-языков, таких как Basic.

Используемый в АРМ VBA является интерпретируемым языком. Как и следует из его названия, VBA близок к Visual Basic, но может выполняться лишь в рамках приложения, в которое он встроен. (Приложение А).

Я максимально автоматизировал заполнение формы 12-тэк в АРМ. Но несколько полей таких как подпись всеравно должны заполняться вручную.

Название макросов используемых в проекте и приведенных в приложениях (Приложение Б, рис. Б.5) :

Переменные, классы и среды системы ASP.NET для взаимодействия с Access

Разрабатывая проект АРМ и создавая Web-приложение, пользовался различными средствами для создания архитектуры приложения, редактирования кода и публикации результатов своего труда на Web-сервере. При этом для конечного пользователя Web-приложение любой сложности остается набором HTML-страниц, каждая из которых имеет свой уникальный URL. (Приложение А) .

Проектируемое АРМ стало универсальным средством, практически в любом используемом Web-браузере. В этом заключено огромное преимущество приложения для Internet по сравнению с приложениями для настольных систем — существование общепринятого «языка общения», HTML кода. Для того, чтобы развернуть Web-приложение достаточно установить его на сервер, после чего приложение может быть доступно любому клиенту с установленным Web-браузером. К сожалению, здесь тоже существует очевидная проблема в обработке HTML кода браузерами разных производителей.

Приложение АРМ, генерирующее HTML код (Приложение А) оптимальный для большинства браузеров, которыми пользуется конечный пользователь. (Приложение Б, рис. Б.17).

автоматизированный информационный статистический отчетность

Доступ к базе данных из ASP.NET

Written on 17 Октября 2007 . Posted in ASP.NET

ОГЛАВЛЕНИЕ

1. Установите подключение к базе данных, используя SQLConnection.
2. Соединитесь с базой данных, используя SQLDataSetCommand.
3. Заполните новый Dataset, использующий SQLDataSetCommand.FillDataSet.
4. Установите новый DataView для заданной таблицы.
5. Свяжите управление сервером, например: DataGrid с DataView.

Конечно, для осуществления такой процедуры необходимо учесть ещё много деталей, которые также должны быть выполнены. Далее, будут предложены Вашему вниманию примеры, показывающие, как эти детали используются в прикладных программах ASP.NET.
Микрософт .NET Framework имеет три средства управления, которые упрощают просмотр больших баз данных: Repeater, DataList и DataGrid. Хотя некоторые детали изменяются, по существу, та же самая процедура связывания используется для всех этих трёх средств управления, и она будет представлена ниже по тексту. Также, в этой статье будет обсуждаться управление связанными данными, с использованием средств управления DataGrid. Для получения дополнительной информации относительно этих средств управления, см. «Server-Side Data Access» и «Data Access and Customization» разделы документации «ASP.NET Quick Start», которая поставляется с Микрософт .NET Framework SDK

Связывание (Binding) SQL данных с Repeater Control

Repeater control полезен только для показа данных, не взаимодействуя с ними. Его преимущество состоит в том, что могут быть установлены шаблоны, позволяющие отображать данные различными способами.
Следующий пример демонстрирует связывание Repeater control с DataView (возвращённого из SQL запроса) который содержит информацию о размещении книг. В примере также присутствуют HeaderTemplate и FooterTemplate, которые включаются вначале и конце листинга, соответственно.
Repeater control выполняет только итерации по связанным данным, предоставляя itemtemplate один раз для каждого элемента в коллекции DataSource. Он не предоставляет ничего, кроме элементов, содержащихся в его шаблонах.

Доступ к SQL базе данных

1. Импортируйте необходимые для вашей страницы пространства имён. Это позволит обеспечить ваш код доступом к необходимым классам.

2. В пределах тэга

3. В тэге страницы , отобразите данные.

4. Откройте Repeater control

5. Установите шаблоны для Repeater control.

а) Установите шаблон для открытия таблицы и отображения заголовков столбцов.

б) Установите шаблон отображающий реальные данные.

в) Установите шаблон для закрытия таблицы.


6. Закройте Repeater control

7. Закройте страницу.

Связывание SQL данных с DataList Control

В то время как Repeater является итератором общего назначения, DataList обеспечивает некоторые дополнительные возможности управления размещением в листинге. В отличие от Repeater, DataList позволяет включить дополнительные элементы вне определения шаблона, подобно строкам, ячейкам и промежуткам таблицы, которые содержат атрибуты стиля. Это предоставляет более широкие возможности форматирования. Например, DataList поддерживает свойства RepeatColumns и RepeatDirection, которые определяют, должны ли данные быть представлены в нескольких столбцах и в каком направлении (вертикально или горизонтально) чтобы представить элементы данных. DataList также поддерживает атрибуты стиля: тип, размер и имя шрифта.
Этот пример показывает, как обратиться к SQL базе данных, которая содержит заголовки книг и немного ключевой информации о каждой книге, и затем отображает данные, используя DataList. Результат имеет всю заданную информацию для каждой книги, сгруппированную вместе, и информация для каждой книги представлена в двух столбцах в порядке слева направо.

Доступ к SQL базе данных

1. Импортируйте необходимые для вашей страницы пространства имён. Это позволит обеспечить ваш код доступом к необходимым классам.

2. В пределах тэга

4. Откройте DataList, устанавливая его для двух столбцов, которые будут заполнен в горизонтальном порядке.

5. Установите шаблон DataList с именем «itemtemplate».

а) Используйте элемент

б) Используйте вложенный элемент

в) Связываем и показываем остальную часть данных в шрифте, установленном элементом

Связывание SQL данных с DataGrid Control

Этот пример показывает список авторов, их имена, адреса, телефоны и некоторые другие данные.

Доступ к SQL базе данных

1. Импортируйте необходимые пространства имён для вашей страницы. Это обеспечит ваш код доступом к необходимым классам.

2. В пределах тэга

3. В тэге страницы , отобразите DataGrid.

а) Покажите заголовок страницы.

б) Отобразите данные.

Вставка данных в SQL базу данных

После подключения и связывания с данными в базе, может возникнуть необходимость добавления строк данных в базу. Этот раздел рассказывает, как добавить новые строки данных, используя DataGrid и специальную форму для ввода.

Добавление новых строк в базу данных

1. Импортируйте необходимые пространства имён.

5. В тэге страницы , отображаем DataGrid, и создаём отображение входной формы.

а) Открываем форму.

Обновление данных в базе

Часто нужно модифицировать поля в существующей базе данных. Этот раздел показывает, как это следует делать. В этом примере, на показываемой странице, слева от отображаемого DataGrid есть дополнительный столбец.

Он имеет кнопочку «edit», которая, когда её нажимаешь, делает все поля в текущей строке текстовыми, показывая в них имеющиеся данные. После этого, поля могут быть отредактированы, что предоставляет пользователю возможность внесения в них новой информации. Когда новая информация внесена, пользователь может нажать кнопочку «update», после чего данные будут изменены непосредственно в базе данных.

Модификация существующих данных

1. Импортируем необходимые пространства имён.

. Часть 1

Система доступа к базам данных

Система доступа к базам данных, по сути, представляет собой Web-версию популярной программы ISQL, входящей в состав Microsoft SQL-сервера, а фактически позволяет подключаться и выполнять запросы к удаленному или локальному SQL-серверу. При этом указываются сервер, база данных, учетная запись (login) и пароль доступа. Исходя из введенных значений система пытается осуществить подключение и выполнить введенный запрос. Результат по желанию может быть сформирован или в табличном, или в XML-представлении.

Илон Маск рекомендует:  Глава 9 видеодоступ 2 графический режим

Итак, приступим к созданию нашего Web-интерфейса. Для начала изготовим форму диалога с пользователем:

Для читателей почти все должно быть очевидным. Во-первых, первая директива указывает на то, что в качестве языка описания сценариев используется язык C#. Во-вторых, создаваемая форма будет наследовать свойства и методы класса Aquarius, описанного в исходном файле «WebSql.cs». В-третьих, директива Trace=«False» указывает на то, что в настоящий момент режим отладки приложения выключен и ASP+ не будет выдавать в качестве результата работы страницы подробный отчет обо всех последовательно произведенных действиях и событиях.

Однако возможен и следующий вариант:

В данном случае ссылка «исходный файл» заменена ссылкой на результат его компиляции. По умолчанию система будет производить поиск последнего в подкаталоге bin корневого каталога нашего Web-приложения. Разумеется, заранее необходимо позаботиться о наличии этого файла именно там, прекомпилировав его с помощью процедуры nmake.exe (для того чтобы узнать, как это сделать, достаточно запустить ее без параметров). Такая технология позволит скрыть исходные тексты ваших приложений даже от лиц, имеющих доступ к серверным файлам.

Далее страница-интерфейс мало чем отличается от обычной HTML-страницы, разве что несколькими типичными для ASP+ компонентами. Давайте рассмотрим их подробнее:

Таким способом можно создать текстовое поле размером и числом максимально вводимых символов, равными 20, с названием «txtServer». Давайте разберемся с последней директивой: Runat= «server». Этот атрибут указывает компилятору на то, что к данному элементу будет осуществлен программный доступ, то есть данный объект интерфейса может быть обработан программно. Однако необходимость в этом возникает далеко не всегда, и именно поэтому следует прибавлять данную директиву не ко всем компонентам интерфейса страницы, а лишь применительно к тем, обработка событий которых нам потребуется в дальнейшем.

Так, по сути, компонент представляет собой ASP+ вариант обычного HTML -компонента . Аналогом же компонента является компонент

Директива AutoPostBack= «True» указывает компилятору ASP+-страницы создать клиентский механизм отсылки страницы обратно на сервер при возникновении события, требующего программной обработки. К примеру, в вышеприведенном случае компилятор автоматически вернет серверу страницу при возникновении события OnChange и вызовет его обработчик lstDatabases_Change.

Необходимый для возврата код будет сгенерирован компилятором автоматически. В данном случае будет сгенерирован следующий код:

где __doPostBack функция вида:

Как видите, __doPostBack() — это JavaScript-код, выполняющийся на стороне клиента и попросту извлекающий идентификатор обрабатываемого компонента интерфейса и необходимую дополнительную информацию (аргументы), которую он посылает обратно на сервер, где она обрабатывается соответствующим обработчиком. С точки зрения управления результирующая HTML-страница в браузере выглядит следующим образом:

Давайте посмотрим, как выглядит вышеупомянутый обработчик события OnChange:

Обработчик события OnChange компонента lstDatabases (lstDatabases_Change) проверяет выбранное значение в выпадающем списке выбора на предмет его совпадения с константой TEXT_REFRESH. Если выбранное значение не совпадает с константой, то метод завершает свою работу. В противном случае (когда известно, что пользователь пытается обновить базу данных) строится строка соединения с базой данных исходя из введенных пользователем значений:

Теперь, когда у нас уже есть строка подключения, нам необходимо создать экземпляр объекта типа SQLConnection (соединения с базой данных) следующим образом:

Далее следует создать экземпляр ADO+ объекта типа SQLDataSetCommand, который является аналогом объекта Command ADO. Для этого воспользуемся константой

После этого необходимо создать ADO+-объект доступа к данным — DataSet. Из предыдущей статьи известно, что объект DataSet — это представление в памяти, содержащее наборы таблиц, их отношений и связей. Объект DataTable является аналогом ADO-объекта RecordSet и служит для выполнения операций над наборами данных.

Объект DataTable состоит из единственной таблицы, которая может представлять собой результат выполнения определенной выборки, хранимой процедуры, вида и т.д. Иначе говоря, объект DataTable содержит данные, а объект DataSet содержит объект(ы) DataTable.

Далее следует блок try — catch — finally, служащий для обработки исключений. Здесь важно отметить, что метод FillDataSet объекта SQLCommand заполняет объект DataSet в зависимости от команды, заданной в SQLDataSetCommand. Второй параметр — «Databases», по сути, позволит нам обозначить результаты работы запроса определенным именем, используя которое можно будет в дальнейшем ссылаться на данные из результата этого запроса.

Далее необходимо осуществить две привязки данных в только что полученной таблице «Databases» типа DataTable с выпадающим списком выбора lstDatabases типа : привязку текста, показываемого пользователю с полем «Name» нашего объекта типа DataTable при помощи метода DataTextField, и привязку значения каждого пункта выпадающего списка выбора с помощью метода DataValueField.

Установка свойства DataSource нашего выпадающего списка выбора (lstDatabases) позволяет окончательно задать таблицу для связывания со списком выбора:

После этого достаточно будет одного вызова метода DataBind(), который свяжет все объекты нашей страницы, для которых заданы параметры связей:

В случае возникновения ошибки можно попросту выставить свойство «text» объекта типа Label (метка) — равным значению текста, соответствующего коду возникшей ошибки:

После выполнения всех действий необходимо проверить и закрыть соединение с базой данных, если оно открыто:

Теперь стоит разобраться с функцией загрузки страницы Page_Load, которая, заметьте, вызывается после вызова любого конструктора компонентов класса:

Помимо оговоренных инициализаций переменных _ServerName, _UserName, и _Password здесь с самого начала выполняется инициализация переменной _DatabaseName, причем делается это только в том случае, если из соответствующего выпадающего списка выбора выбрано значение, то есть когда индекс выбранного значения из списка не равен -1.

Далее необходимо выяснить, является ли данная загрузка страницы первой, с тем чтобы выполнить ряд действий по инициализации компонентов нашего Web-интерфейса. Для этого лучше всего воспользоваться переменной — членом класса Page (объекта страница) IsPostBack, которая принимает значение «False», если страница загружается в первый раз и «True», если нет.

Если загрузка страницы является первой, то необходимо выставить значения «радиокнопок» BordersOn и HTML, подготовить и добавить пункт в список выбора только что выполненных запросов lstSave. Константа TEXT_BLANK служит для отображения в списке выбора, а константа «» соответствует ее значению. И наконец, необходимо проверить значение флажка запоминания пароля и обнулить поле «пароль», в случае если флажок сброшен:

Теперь разберемся с другими обработчиками событий, возникающих при действиях пользователей. Для начала рассмотрим обработчик нажатия на кнопку «Save Query», посредством которой пользователь может сохранить введенные ранее запросы и добавить их в выпадающий список выбора lstSave:

По сути, этот компонент интерфейса должен сохранять содержимое компонента, в который вводится текст запроса всякий раз, когда пользователь потребует этого. Для начала присвоим это значение внутренней переменной QueryValue. Далее создадим локальную переменную Length и присвоим ей значение константы QUERY_LIST_MAX, которая содержит значение максимально допустимой строки запроса, показываемой в списке выбора lstSave. Если длина строки меньше константы, то необходимо сосчитать длину первой.

И наконец, необходимо добавить в список запросов строку и ее значение. Для этого, во-первых, необходимо извлечь из исходной строки ровно length символов. Воспользуемся функцией SubString, с помощью которой укажем, что строку необходимо извлечь начиная с позиции 0 и длиной в length символов от исходной:

Таким образом, мы используем «обрезанную» строку для ее показа в списке и исходную, — для хранения ее в качестве значения.

Далее создадим и добавим новый элемент к списку выбора:

Теперь настала пора разобраться и с обработчиком нажатия на кнопку выполнения запроса — «Execute Query»:

Здесь, как и в обработчике Change объекта lstDatabases, строится строка подключения к базе данных — sql_conn_str и также создается объект SQLDataSetCommand. Обратите внимание, что в качестве переменной текста SQL-запроса используется текст, введенный пользователем и хранящийся в переменной sql_command. Таким образом, метод SQLDataSetCommand выполнит любой запрос, находящийся в переменной sql_command, а следовательно, введенный пользователем в соответствующее текстовое поле (поле Text компонента txtQuery).

Далее попробуем выполнить метод FillDataSet только что созданного экземпляра объекта SQLDataSetCommand — myCommand и проверим значение флажка показа результатов выполнения запроса в виде таблицы (или в виде XML).

Если пользователь выбрал режим просмотра результатов в виде XML, выставим флажок видимости (Visible) соответствующего текстового поля (txtXML ) в true. После этого от нас потребуется попросту установить свойство XML заполненного объекта DataSet (ds) равным значению поля Text текстового поля txtXML .

Если же пользователь выбрал режим просмотра результатов в виде таблицы, присвоим переменной ширины разделительных линий таблицы BorderWidth объекта типа DataList (переменная grdResults) значение, равное целочисленному значению логической переменной Checked радиокнопки-переключателя включения/выключения показа разграничительных линий BordersOn. Вот и все, осталось только насладиться простотой и гибкостью связывания данных с помощью ASP+ и ADO+, выставив значение свойства DataSource объекта типа DataList равным значению по умолчанию (DefaultView). После этого можно вызывать метод DataBind и любоваться результатом.

Рассмотренная система состоит всего из двух файлов: WebSql.aspx — страницы с представлением интерфейса и WebSql.cs — описания класса AquariusWI с обработчиками событий и методами работы приложения.

Объект DataGrid — расширение возможностей!

В заключение хотелось бы привести еще один пример, ярко иллюстрирующий преимущества ASP+ перед ASP. Для этого давайте рассмотрим, пожалуй, наиболее простую задачу, которую тем не менее наверняка приходится решать каждому Web-программисту чаще других: отображение содержимого таблицы базы данных в виде HTML-таблицы. Задача довольно простая и, в принципе, легко осуществимая с помощью ASP. Давайте оценим, насколько облегчается ее решение и насколько расширяются возможности при использовании ASP+ — компонента DataGrid. Начнем с элементарного — формирования данных в виде обычной таблицы:

Как видите, осуществляется элементарная привязка объекта типа DataGrid с источником данных. В данном случае для этого используется ODBC алиас sample, база данных Pubs и таблица Authors.

Попытаемся теперь добиться от этого компонента большей управляемости. Оставим первоначальный код без изменений, но добавим несколько штрихов к нашей таблице. Изменим лишь объявление компонента таким образом, чтобы заголовок полученной таблицы был синего цвета, а строки поочередно светло- и темно-серого.

Отображение таблиц или данных в табличном представлении зачастую не обходится без разбиения на части. Ведь одна таблица может содержать огромное количество записей. В таком случае проблему ее «листания» приходится решать вручную, причем использования для этого традиционного способа — далеко не самое приятное занятие. В объекте DataGrid предусмотрено и это. Смотрите сами:

Попробуем отобразить таблицу, но так, чтобы при этом можно было ее редактировать. Для обычного ASP задача далеко не тривиальная, требующая обработки не одной формы. Посмотрите и оцените сами, как просто эта задача решается с помощью ASP+:

Объяснения излишни: код говорит сам за себя. Пожалуй, это основное достоинство ASP+ — «красноречивость» кода. Попробуйте скопировать его в .aspx-файл и выполнить. Поверьте, результат и то, какими небольшими усилиями он может быть достигнут, вас приятно удивит.

Как видите, все довольно просто, однако эта простота обусловлена наличием в ASP+ богатой палитры визуальных компонентов, позволяющих заменять целые группы обычных HTML-компонентов, использовавшихся в обычном ASP. Достоинство этих компонентов (в данном случае, например, компонентов DataList или DataGrid) заключается не только в визуализации разнообразных данных и процессов, но и в богатых возможностях обработки событий, наличия огромного количества типовых решений и всевозможных шаблонов для выполнения типовых операций и т.д. И это еще одно преимущество ASP+.

Работа с данными из связанных таблиц в ASP.NET MVC или разработка Lookup компонента

Разработка любого бизнес приложения так или иначе связана с обработкой определенного количества данных, выстраиванием связей между этими данными, а так же их удобным представлением. В данной статье мы рассмотрим работу с межтабличным взаимодействием в ASP.net MVC, а так же возможности по визуализации этого взаимодействия, попробуем разработать свой компонент, с одной стороны позволяющий удобно выбирать нужные данные, с другой легко конфигурироваться. Будем использовать JqGrid, для реализации поиска, сортировки и выбора связанных данных. Коснемся формирования динамических предикатов, посмотрим как можно использовать метаданные в html helper и в заключении рассмотрим уже существующие компоненты этого класса.

В самом простом примере, которой наверняка известен каждому читателю, для отображения данных из связанных таблиц мы можем применять обычный DropDownList, однако его применение достаточно ограничено и не всегда эффективно. В нашем случае были четкие требования, описывающие компонент, со встроенным списком, сортировкой, поиском по связанным данным, а ввиду того, что полей такого типа было достаточно много, было принято решение разрабатывать соответствующий компонент.

Рассмотрим пример из двух связанных таблиц: «Пользователь» и «Группа»

Мы видим, что в группе может быть N-ое количество пользователей, а пользователь в свою очередь может соответствовать определенной группе. Теперь давайте рассмотрим код, который позволит нам эти данные получить, а так же визуализировать. Для странички выдающей список записей это достаточно просто.

Собственно в коде контроллера представленном выше мы запрашиваем помимо данных профиля пользователя еще и связанную с этим профилем группу. Далее выведем ее в нашем View при помощи DisplayNameFor.

Если нам необходимо лишь только выводить связанные данные пользователю, то этого вполне достаточно. Для редактирования, как я уже говорил, можно использовать DropDownList.Однако в нашем случае есть необходимость создать более гибкий элемент управления, и сделать его максимально простым в настройке, таким как представленный выше запрос к связанной таблице. Первое с чего мы начнем будет разработка Html helper, который позволит в удобной форме описать использование нашего компонента в представлении, и обеспечить его функционирование.

1. Разработка Html Helper для Lookup компонента

Что есть Html Helper в ASP.net MVC? По большей части это обычные методы расширения позволяющие обращаться к своему классу родителю дабы создавать HTML контент. Для отображения нашего компонента будем использовать стандартное для lookup контролов представление, а именно текстовое поле и кнопку. id записи будем хранить в скрытом поле.
Помимо html контента, html helper также позволяет обращаться к метаданным моделей и полей в которых используются, так что первое что мы сделаем это создадим атрибут, который мог бы выделить наше поле в модели, а так же снабдить его дополнительной информацией необходимой для корректной работы компонента.

Итак код LookupAttribute представлен ниже


Тут все просто, сохраним поле, которое будем использовать в качестве текстового описания связанной записи, а также тип модели на которую будем ссылаться. Так что код нашей модели можно немного преобразить:

Теперь видно, что мы будем ссылаться на модель UserGroup, поле для текстового представления GroupName. Однако, для того чтобы этот атрибут мог использоваться в нашем HTML Helper нам необходимо добавить его к коллекции метаданных представления. Для этого нам нужно реализовать класс наследник DataAnnotationsModelMetadataProvider и зарегистрировать его соответствующим образом.

Для того что бы получить возможность расширять метаданные поля, необходимо унаследоваться от класса DataAnnotationsModelMetadataProvider и переопределить метод CreateMetadata. Класс DataAnnotationsModelMetadataProvider реализует поставщик модели метаданных по умолчанию для ASP.NET MVC.
Все достаточно просто. Если в коллекции переданных атрибутов есть наш, то надо бы добавить его в AdditionalValues коллекции метаданных, после чего возвращаем измененную коллекцию. Для корректной работы данного класса его надо зарегистрировать. Идем в Global.asax.cs и добавляем строчку:

Теперь мы готовы продолжить разработку нашего HTML helper. В общем виде функция HTML helper будет выглядеть так

Отмечу, что мы так же даем пользователю возможность задать тип модели непосредственно из представления. В первой строке получаем название нашего поля, затем вызываем функцию PrepareLookupCommonMetadata. Данная функция будет рассмотрена позже, скажу только что она используется для обработки метаданных и обращению к данным связанной таблицы через эти метаданные. Строчка ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData) используя выражение expression получает метаданные текущего поля, собственно наши AdditionalValues. Далее из возвращенного объекта commonMetadata получаем наш lookupAttribute и вызываем функцию генерации HTML кода.

Теперь обратимся к функции обработки метаданных PrepareLookupCommonMetadata.

Сначала смотрим, задал ли пользователь в представлении тип и модель, если да, то обновляем данные в AdditionalValues. Идем дальше

Проверяем что AdditionalValues имеет место быть, затем извлекаем его из коллекции метаданных. Далее при помощи метода расширения Типа GetPropertyWithAttribute получаем поле с атрибутом Key из связанной Model. Это поле будем использовать для идентификации нашей связи, т.е это поле и есть первичный ключ связанной таблицы. Если не находим его, то пытаемся сформировать сами при помощи правила- Имя модели + > Если получили, то достанем информацию о колонках и текстовое определение связанной таблицы.
Теперь подробнее остановимся на получении информации о колонках. Этот список полей будет использоваться для вывода записей в JqGrid. Для конфигурирования этого списка создадим еще один атрибут.

Теперь посмотрим на измененное представление связанной таблицы. Регистрировать LookupGridColumnsAttribute не нужно, доступ к этому типу будет возможен, через LookupAttribute используя поле Model, которое описывает тип модели.

В список колонок, в дополнение к уже присутсвующему там по умолчанию GroupName, добавляем Description. Теперь возвращаемся к рассмотрению функции подготавливающей метаданные по колонкам.

Функция в качестве аргументов принимает метаданные связанной таблицы, а так же метаданные нашего поля. В метаданных связанной таблицы пытаемся найти заданный LookupGridColumnsAttribute атрибут. Смотрим, что он не null и идем по списку колонок попутно запрашивая их метаданные для получения нужного нам для представления DisplayName соответствующей колонки. Если метаданные не обнаружены, кидаем исключение, иначе добавляем полученные данные в коллекцию columns. После того как коллекция колонок сформирована, добавляем ее в метаданные поля в виде AdditionalValues, они пригодятся нам далее.

Что же теперь самое время вернуться к нашей функции PrepareLookupCommonMetadata и рассмотреть последний вызов, а именно UpdateNameFieldInfo.

Данная функция получает всю информацию относительно текстового представления нашей связи, а именно, того самого поля, которое мы указали в виде «NameField = „GroupName“» в атрибуте Lookup и добавляет данную информацию в AdditionalValues метаданных нашего поля. nameFieldMetedata.SimpleDisplayText — значение поля GroupName из связанной таблицы. nameFieldMetedata.DisplayName — Название поля GroupName из связанной таблицы.

Илон Маск рекомендует:  getcwd - Получить имя текущего рабочего каталога

На этом можно сказать, что мы обладаем всей нужной нам информацией для того, чтобы создать соответствующий Html код. Рассмотрим как работает, и что принимает функция LookupHtmlInternal. Напомню, что ее вызов происходит из функции LookupFor, рассмотренной в самом начале раздела по HtmlHelper.

Принимаем следующие аргументы. 1. htmlHelper — позволяет нам генерировать html код, 2. metadata — По сути это метаданные поля, содержащие в себе все доп. метаданные полученные на этапах сбора информации. 3. Выделенный отдельно lookupMetadata. 4. name — Имя нашего поля, как во вьюхе. 5 action — Указываем контроллер и метод, которые будут использоваться для запроса данных. 5 htmlAttributes — доп. html атрибуты, определенные программистом.
Далее смотрим, что имя поля не null и строим div содержащий основные параметры нашего поля. Остановимся на основных параметрах: type — тип модели, на которую ссылаемся, nameField — имя текстового поля из связанной таблицы, которое идентифицирует связь (в нашем случае имя группы), idField — первичный ключ связанной таблицы, nameFieldDisplay — значение текстового поля из связанной таблицы, которое идентифицирует связь ну и action — как я уже говорил это контроллер и метод, которые будут использоваться для запроса данных.

Далее по той же схеме стоим div содержащий в себе все колонки из связанной таблицы, которые будут использоваться для построения представления для JqGrid.

Формируем оставшуюся часть атрибутов, а именно поле содержащее текстовое представление нашей связи (nameField), скрытое поле содержащее id нашей связи, кнопка по которой будем открывать JqGrid c данными из связанной таблицы.
Замечу, что id текущей выбранной записи мы получаем из метаданных поля, воспользовавшись следующим вызовом metadata.SimpleDisplayText.

Все что сгенерировали упаковываем в корневой div и возвращаем html строку браузеру для отображения.

Для того чтобы воспользоваться нашим html helperом было просто, реализуем также перегрузки метода LookupFor

Для того чтобы использовать наш html helper достаточно в представлении вызвать Html.LookupFor(model => model.UserGroupId).
Для того чтобы в представлении работал intellisense, необходимо в web.config в раздел system.web -> pages -> namespaces добавить пространство имен, в котором находится класс реализующий Ваш Html Helper, или просто разместить этот класс в одном из уже определенных пространств имен, скажем в System.Web.Helpers. Либо непосредственно в представлении указать .

На этом можно сказать, что разработка нашего HtmlHelper подошла к концу и мы переходим ко второй части.

2. Expression и формирование динамических предикатов.

Для того чтобы создать набор базовых запросов, которые позволят разработчику легко начать использовать наш компонент в режиме «по умолчанию», нам необходимо подготовить предикаты позволяющие формировать дерево запросов во время выполнения нашего приложения. Рассмотрим класс LinqExtensions, который содержит несколько методов позволяющих в конечном счете формировать динамические Linq. Начнем с реализации метода Where.

Итак fieldName — поле данные из которого будем сравнивать, searchString — строка которую будем сравнивать, и функция из класса String которая будет использована для реализации сравнения. Далее разберем все подробно. Смотрим, что строка, которую нам передали не null. Если все хорошо, то определяем тип Expression.Parameter(typeof(T)); к которому будем обращаться, по сути это будет тип модели. Следующей строкой определяем свойство типа, поле из модели, которое будем использовать для сравнения. Затем формируем вызов функции compareFunction из класса string с аргументами searchString и сформированным ранее «указателем на свойство». Далее формируем лямбду и используем IQueryable контекст дабы применить к нему Where с только что сформированным предикатом. Возвращаем сформированный IQueryable.

Реализуем несколько функций, с заранее определенной функцией сравнения строк

По образу и подобию реализуем методы Equal и NotEqual

Тут все по аналогии подробно останавливаться не буду.

Также нам необходимо иметь возможность динамической сортировки, так что реализуем метод ApplyOrder

По аргументам: 1. Property — поле по которому будем сортировать; 2.methodName — Метод который будем использовать для сортировки. Далее формируем набор параметров. MakeGenericType в нашем случае сформирует делегат Func , затем используем его для создания лямбды, которую передаем в качестве аргумента методу определенному как methodName и вызываем все это при помощи рефлексии.

Таким образом мы теперь в состоянии определить динамические вызовы сортирующих методов из Queryable.

На этом реализация вспомогательного класса Linq заканчивается и переходим к следующему этапу.

3. ModelBinder и конфигурация нашего компонента.

Ввиду того, что количество передаваемых нам данных конфигурации достаточно велико, было бы неплохо их структурировать и поместить в объект, обеспечивающий простой и понятный доступ к любым настройкам. Напомню, что мы используем jqgrid, который будет снабжать нас данными касательно сортировки, поиска, разбиения на страницы и дополнительными параметрами, которые по необходимости определим самостоятельно. И так перейдем к модели:

Не буду подробно останавливаться на описании классов. Далее рассмотрим участок кода, позволяющий данные полученные от jqGrid или лукапа преобразовать в соответствующий экземпляр класса.

Для реализации биндинга нам необходимо унаследоваться от класса IModelBinder и реализовать функцию BindModel, где controllerContext — Контекст, в котором функционирует контроллер. Сведения о контексте включают информацию о контроллере, HTTP-содержимом, контексте запроса и данных маршрута. bindingContext — Контекст, в котором привязана модель. Контекст содержит такие сведения, как объект модели, имя модели, тип модели, фильтр свойств и поставщик значений. Мы получаем HttpRequestBase и используем этот объект для получения данных переданных в запросе. Далее формируем структуру модели настроек и возвращаем полученный класс. Для того, чтобы биндинг начал работать его нужно зарегистрировать, так что пройдем в Global.asax.cs и добавим соответствующий вызов.

В итоге, после всех регистраций, мой Global.asax.cs выглядит следующим образом:

Теперь в контроллере мы можем использовать следующую запись для обращения к аргументам пришедшим от лукапа.

На этом работу с объектом конфигурирования мы заканчиваем и переходим к следующему этапу:

4. Реализация общего MVC контроллера для Lookup контрола.

Для большинства лукапов, которые мы используем в нашем приложении нет нужды в какой- то сложной конфигурации, фильтрации или сортировки, так что разработаем объект реализующий базовую сортировку и поиск в не зависимости от типа пришедшего из компонента, а так же контроллер использующий этот объект для организации доступа к данным в режиме «по умолчанию». Начнем с класса LookupDataResolver. Этот класс будет отвечать за операции поиска, сортировки в режиме «по умолчанию». Отмечу, что наш компонент помимо выбора элемента из грида, должен обеспечивать разрешение элемента по текстовому значению введенному в соответствующее поле.

В виду того, что тип определяется только в режиме выполнения, реализуем функцию, которая будет типизировать нашу модель в виде дженерик аргумента и вызывать функцию соответствующую запросу. Так что мы сможем использовать следующий код dbContext.Set().AsQueryable(); для формирования базового запроса.

Рассмотрим функцию LookupMethodCall.

Сначала мы ищем в текущем типе метод methodName. После этого при помощи функции MakeGenericMethod подготавливаем нашу модель для использования в виде дженерик аргумента. Формируем параметры: settings (полученная из лукапа сущность настроек), dbContext (контекст для обращения к бд), onAfterQueryPrepared (делегат, который будет вызван сразу после формирования базового запроса к бд. Он нужен для добавления доп. фильтров, если они необходимы). Далее создаем соответствующую лямбду, которая будет осуществлять вызов нашего метода, после чего компилируем ее и вызываем.

Реализуем функции выполняющие вызов метода соответствующего запросу, при помощи функции LookupMethodCall. BasicLookup для разрешения текста введенного пользователем в лукап, будет обращаться к дженерик функции LookupSearch. BasicGrid обеспечит сортировку и поиск в гриде, вызывает дженерик функцию LookupDataForGrid.

Реализуем функции выполняющие операции с базой данных и формирующие результирующие наборы данных. Это две дженерик функции вызовы которых описаны выше.

Итак, получаем типизированный Queryable из dbContext для соответствующей модели, смотрим определен ли делегат, если да, то вызываем его и используем возвращенный им запрос для дальнейшего формирования query. Далее все просто, используем WhereStartsWith для формирования запроса. Используем значения из сущности настроек settings.Filter.SearchField, settings.Filter.SearchString соответственно для определения поля и строки по которой производится фильтрация. В заключении формируем результирующий массив, используя рефлексию для получения данных из полей экземпляра t по типу модели modelType.
Возвращаем только две колонки: label — текстовое представление связанной записи и id — первичный ключ.
Если значений будет больше одного, то текст в контроле будет серым, это будет свидетельствовать о том, что разрешение записи не удалось и нужно обратиться к более детальному представлению.

Далее переходим к реализации функции LookupDataForGrid, которая будет обеспечивать возможности фильтрации и поиска по связанным данным.

Функция реализуется по аналогии с LookupSearch, тут мы добавляем обработку постраничного разбиения, базовой сортировки и поиска. Список значений по колонкам получаем при помощи функции GetDataFromColumns. Данная функция использует атрибут LookupGridColumnsAttribute для определения списка колонок, которые ожидает наш грид. Ниже приводится ее код:

Результирующий массив включает в себя, по умолчанию, первичный ключ и поле содержащее значение текстового описания связи. Далее из типа модели получаем атрибут LookupGridColumnsAttribute и используя instance, при помощи рефлексии, вытаскиваем значения колонок.

Теперь настало время реализовать базовый контроллер, который обеспечит функционирование всех лукап контролов на форме в режиме «по умолчанию»

Для корректной работы в классе наследнике необходимо переопределить контекст базы данных и если Вы планируете расширять запросы по умолчанию, то и функцию LookupBaseQuery. Данная функция используется для вызова из LookupSearch и LookupDataForGrid при формировании базового query. Отмечу также, что имена функций в контроллере, к которым обращается JS для получения данных, могут быть определенны во время конфигурации html helper. Однако, имя функции выполняющей получение данных для jqGrid формируется по следующему шаблону: Имя указанное при конфигурировании html helper + Grid. По умолчанию JS будет обращаться к функциям LookupData и LookupDataGrid.

На этом можно сказать что разработка базовых элементов компонента завершена. В исходниках вы ко всему прочему сможете найти файл lookup.js, который отвечает за клиентскую часть работы нашего компонента, рассматривать его здесь я не стал, так как он не представляет большого интереса.

5. Пример использования

Рассмотрим модели, которые были описаны в начале статьи. Применим к связи наш компонент.

Итак, у нас есть UserProfile в котором мы добавляем Lookup ссылку на UserGroup и определяем какое поле будем использовать для текстового представления данной записи. В таблице UserGroud добавляем атрибут LookupGridColumns в котором указываем доп. колонки, которые хотели бы видеть в представлении. Собственно это все, теперь переходим к контроллеру.

Наследуемся от LookupBasicController и переопределяем GetDbContext для того, чтобы дать LookupBasicController доступ к контексту бд.

Добавили запрос к связанным данным из таблицы UserGroup.
На этом настройка контроллера заканчивается и мы переходим к представлению.

Здесь нужно не забыть добавить доп. скрипты типа jqgrid, lookup и т.д. Подробнее рассмотреть представление Вы сможете воспользовавшись исходниками прилагаемыми к статье.

В итоге Вы получаете поле с кнопкой, позволяющее удобно искать и сортировать данные в связанных таблицах. Выбор элемента в таблице осуществляется при помощи двойного щелчка, на нужном элементе. Сейчас еще рано говорить о каком-то завершенном элементе управления, еще многое предстоит реализовать. Код нуждается в рефакторинге и оптимизации, однако в целом функционирует и реализует основные функции заложенные на стадии дизайна.

Доступ к базе данных с помощью ASP.NET

Доступ к базе данных с помощью ASP.NET

Ядром любого приложения баз данных является база данных. Для использования базы данных необходимо иметь надежный и безопасный способ подключения. На платформе .NET этот способ реализуется с помощью пространства имен System.Data и одной строки подключения.

Учтите, что доступ к данным связан с рядом трудностей. Одна из них заключается в том, что пользователь может не иметь прав доступа к базе данных, включая выполнение запроса на выборку данных. Еще одна часто возникающая проблема связана с сохранением имен и паролей пользователей в простом текстовом файле, который обычно не отображается Web-сервером для внешних пользователей. Например, при просмотре кода ASP-страницы очень редко можно встретить следующие строки:

доступ к БД из ASP кода

Как получить доступ к БД (SQL Server) из ASP кода?

Например, код обычного VB риложения для этого выглядит так:

09.07.2009, 16:47

Как передать данные из ASP-кода в asp-страницу?
У меня есть asp-страница, которая получает с другой страницы данные, обрабатывает их и переходит (с.

Аналог следующего кода ASP в ASP.NET
Народ, есть какой нибудь аналог этого кода ASP в ASP.NET, (как с помощью DataSet изобразить тоже.

Доступ к данным по ip на ASP
Подскажите пожалуйста. Как сделать на ASP, чтобы проверив IP-адрес клиента народ из внутренней сети.

Доступ из COM к namespase исполняемого ASP
Не подскажет ли кто объект для получения доступа из COM-объекта к объектам создаваемым в.

Доступ к клиентскому сценарию из ASP
Может кто знает как получить доступ из ASP к элементам клиентского сценария.Скажем у меня есть.

Asp компонент доступа к базам данных

Этот текст предназначен для тех, кто никогда не имел дела с ASP и вообще смутно себе представляет возможности программирования на стороне сервера. Я ставил себе задачу создать у читателя общее представление о предмете. Отдельные неточности при этом менее важны — пожалуйста, громко не ругайтесь.

Общие сведения

ASP (Active Server Pages) – это мощная технология от Microsoft, позволяющая легко разрабатывать приложения для WWW. ASP работает на платформе Windows NT и IIS (Internet Information Server), начиная с версии 3, хотя вроде есть реализации на других платформах. ASP – это не язык программирования, это внутренняя технология, позволяющая подключать программы к Web-страницам. Основа успеха ASP – простой скриптовый язык (Visual Basic Script или Java Script) и возможность использования внешних COM-компонент.

Как это все происходит?

Вы пишете программу и складываете в файл на сервере. Браузер клиента запрашивает файл. Файл сначала интерпретируется сервером, на выходе производится HTML-код. Этот HTML посылается клиенту. Файлы с программами имеют расширение .asp. Файлы asp – это обычные текстовые файлы, содержащие исходные тексты программ. Файлы делаются с помощью любого текстового редактора. Каталог, в котором размещены файлы asp должен иметь права на выполнение, так как сервер исполняет эти файлы, когда браузер их запрашивает. Собственно программы пишутся на любом скриптовом языке, который установлен в системе. По умолчанию поддерживаются VBScript и JavaScript. Можно доустановить другие (например, Perl). Если ничего специально не указывать используется VBScript. В дальнейшем будем ссылаться только на него. Программные фрагменты заключаются в скобки . Можно ставить открывающую скобку в начале файла, закрывающую – в конце, все что между ними – программа на Visual Basic’е.

Какие средства есть для программирования?

Web – нормальная среда программирования, если правильно понять, что есть что. В VBScript есть все нормальные конструкции структурного программирования (if, while, case, etc). Есть переменные (описывать не обязательно, тип явно не задается). Поддерживаются объекты. Работа с ними обычная – Object.Property, Object.Method. Есть ряд встроенных объектов (Request, Response, Session, Server, Connection, Recordset). Можно доустанавливать другие компоненты (скачивать, покупать, программировать), например для работы с электронной почтой.

Вывод

Понятия «экран», куда можно выводить данные нет. Все, что надо показать пользователю, выбрасывается в выходной поток на языке HTML. Браузер пользователя интерпретирует этот HTML. Для упрощения вывода существует объект Response . Вывод осуществляется с помощью метода Write .

Так производится запись во внутренний буфер объекта Response. Когда скрипт заканчивает работу, весь буфер выдается клиенту. Надо заметить, что клиент получает «чистый» HTML, таким образом программы на ASP не зависят от клиентского ПО, что очень важно. Если внутри выводимой строки нужно использовать кавычку, кавычка удваивается. Другие методы и свойства Response позволяют управлять выводом. Так Response.Buffer регулирует, получает ли клиент данные по мере из записи в Response, или все сразу по завершении исполнения страницы. Метод Response.Redirect перенаправляет браузер на другую страницу. Чтобы им пользоваться, нельзя до него на странице использовать Response.Write.

Программа на ASP не может явно спросить пользователя о чем-то. Она получает данные из других страниц, либо через URL. Передаваемые параметры помещаются во входной поток и доступны через объект Request . Чтобы передать переменную var в программу test.asp , надо написать:

Чтобы из программы получить значение этой переменной, надо написать:

Несколько переменных разделяется знаком &:

Кроме того, чтобы задавать параметры в URL, можно воспользоваться формами HTML. В вызывающей странице пишем так:

Так это выглядит:

При этом пользователь увидит форму из одного поля ввода (var1), в нем будет значение по умолчанию «default». Второе поле (var2) будет невидимо и будет передавать всегда фиксированное значение «var2value». Кнопка «Submit Form» завершает заполнение формы и передает все переменные на test.asp (action). Если method=»get», переменные передаются через URL (test.asp?var1=default&var2=var2value). Если method=»post», передаются вместе с запросом так, что внешне передача переменных не заметна. В вызываемой программе безразлично, какой метод изпользовался (почти). Если у вас нет специальных аргументов за метод GET, используйте метод POST.


Формы

Формы HTML используются для организации диалога с пользователем. Поддерживаются стандартные элементы управления. Все многообразие задается немногими тэгами:

  • INPUT (с параметром TYPE=)
  • SELECT
  • TEXTAREA

Описание – в документации по HTML.

Взаимосвязь между отдельными страницами

Обычно сервер WWW не хранит состояние приложения, т.е. все запросы взаимонезависимы, и нет стандартного способа понять, что несколько запросов пришли от одного и того же пользователя. Но это очень нужно для разработки полноценных приложений и является одной из главных проблем разработки Web-приложений.

Один из методов решения этой проблемы — cookies . Пользователю при первом обращении выдается специальный идентификатор, после этого браузер пользователя предъявляет этот идентификатор при каждом обращении, и сервер может распознать, что это тот же самый пользователь. Пользователь может отключить cookies, в этом случае этот метод не работает.

ASP, используя cookies, предоставляет программисту более простое средство — объект Session (сессия). Сессия стартует, когда новый пользователь обращается к любому asp-файлу приложения. Сессия заканчивается при отсутствии активности пользователя в течение 20 минут, либо по явной команде. Специальный объект Session хранит состояние сессии. Туда можно записывать переменные, которые доступны из любой страницы в этой сессии. Записать данные в этот объект можно просто:

Считать потом еще проще:

Сессия, таким образом, – это еще один метод передачи данных между страницами. Одна страница пишет данные в сессию, другая – берет потом оттуда.

Наряду с объектом Session существует объект Application . Если сессия создается для каждого нового пользователя, до Application существует в единственном экземпляре, и может использоваться всеми страницами приложения.

Управление приложением

Программисту предоставляется возможность реагировать на 4 события: старт/стоп приложения и старт/стоп каждой сессии. Для реализации этих событий предназначен файл global.asa , который должен располагаться в корневом каталоге приложения. Вот его примерный скелет:

Нужно «просто» вписать Ваш код на соответствующее место. Нужно заметить, что отлаживать код для global.asa довольно непросто, так как он выполняется при очень специфических обстоятельствах (к примеру при старте или остановке сервера).

Использование внешних компонент

Если на сервере установлены дополнительные компоненты, их можно использовать из ASP. Стандартные объекты (например из библиотек ADO (Connection и Recordset) и Scripting (Dictionary, FileSystemObject)) доступны всегда. Установка новой компоненты обычно состоит в копировании dll-файла в каталог на сервере и ее регистрации с помощью программы regsvr32.exe. [В COM+ используется своя процедура инсталляции объектов, это однако не влияет на использования объектов.]

Создать экземпляр объекта можно так:

Class.Object указываются в документации на компоненту. В переменной var запоминается ссылка на созданный экземпляр объекта. Когда объект не нужен, ссылку нужно обнулить с помощью команды:

Пожалуйста всегда обнуляйте все ссылки на объекты, когда они больше не нужны. Теоретически это должно происходить автоматически при завершении процедуры/страницы, однако в стандартной сборке мусора есть определенные «проблемы».

В остальном использование компоненты зависит от самой этой компоненты.

Работа с базами данных

Из ASP можно легко и просто работать с любыми базами данных. Это делается через две промежуточные технологии: ODBC и ADO.

ODBC позволяет организовать доступ к любым базам данных через унифицированный интерфейс с помощью языка SQL. Специфика конкретных СУБД учитывается при помощи специальных драйверов БД. Такие драйверы существуют для всевозможных СУБД (в частности SQL Server, Oracle, Access, FoxPro). Поддержка ODBC обеспечивается на уровне операционной системы Windows (NT). Настройка – через Control Panel/ODBC. Базовым понятием является источник данных или data source. Источник данных – это совокупность сведений о базе данных, включая ее драйвер, имя компьютера и файла, параметры. Чтобы пользоваться базой надо создать источник данных для нее. Важно, чтобы источник данных был «системным», в отличии от «пользовательского». После этого надо лишь знать имя источника данных. [В настоящее время ODBC отступает перед натиском технологии OLE DB. На практике это однако практически ничего не изменяет. Вместо имени источника данных нужно использовать Connection String, в которой указывается имя ODBC-драйвера и все его параметры.]

ADO – это совокупность объектов, доступных из ASP, позволяющих обращаться к источнику данных ODBC [или OLE DB]. Фактически нужны лишь 2 объекта – Connection , представляющий соединение с базой данных и Recordset , представляющий набор записей, полученный от источника. Сначала необходимо открыть соединение, потом к нему привязать Recordset, потом, пользуясь методами Recordset’а, обрабатывать данные. Вот пример:

Если команда SQL не возвращает данных, recordset не нужен, надо пользоваться методом Conn. Execute (SQL_COMMAND).

Если Вы хотите вызывать хранимые процедуры сервера БД с параметрами, нужно воспользоваться объектом Command , который в свою очеред содержит объекты Parameter .

Методики программирования, советы


Описание переменных

VBScript — очень нетребовательный к программисту язык. Так он не требует описывать переменные и не содержит явных типов данных. Все переменные принадлежат одному типу Variant . Из-за отсутствия описаний могут произойти очень трудно обнаруживаемые ошибки. Одна опечатка может стоить полдня поисков.

Однако, есть возможность явно потребовать описания переменных. Для этого первой строкой в ASP-файле нужно написать Option Explicit . После этого обращение к переменной, которая не была объявлена с помощью Dim , вызывает ошибку с указанием номера строки.

Кстати, где расположены описания Dim в процедуре — совершенно не важно. Они могут стоять как до использования переменной, так и после, и даже в цикле. Видимо они отрабатываются препроцессором. Явно задать тип переменной с помощью Dim Var as Typ , как в Visual Basic, все равно нельзя.

Чередование ASP/HTML

Если нужно выдать большой кусок HTML, можно не пользоваться Response.Write. Если в asp-файле встречается кусок текста вне скобок , он трактуется просто как HTML, который надо вывести. Пример:

Обработка ошибок

Для отслеживания ошибок используется специальный объект Err . Он устанавливается в ненулевое значение, если предыдущая команда породила ошибку. Ее можно проверять с помощью If, и таким образом реагировать на ошибки. Чтобы из-за ошибки не прерывалось выполнение программы, в начале нужно включить команду

Включение других файлов

Можно выносить повторяющийся код в отдельный файл, и подключать к разным другим по мере необходимости с помощью команды include . Это очень удобно, если вы хотите вынести повторяющийся код в отдельный файл и использовать снова и снова в разных страницах:

Важно: все includes в тексте отрабатываются до исполнения файла. Т.е. даже если include стоит внутри if, то сначала будут включены все includes во всех ветках, и только потом, во время исполнения, будет принятно решение, какую ветку выполнять. Т.е. следующий код не дает условного включения файлов:

Обработка форм

Если надо что-то спросить у пользователя и на основании этого что-то сделать, в простейшем случае создается два файла: один с формой, второй – с ее обработчиком. Обработчик выполняет все действия. Пример:

Рекурсивная обработка форм

Удобный метод состоит в том, чтобы сбор данных и обработку осуществлял один и тот же файл. Для этого пишется asp, в котором есть разные разделы. Специальная переменная отвечает за выбор раздела при запуске. Пример:

Переменные HTTP

Запрос от браузера, кроме запрашиваемой страницы несет еще некоторые данные. Эти данные, например, IP-адрес клиента, доступны через специальные переменные объекта Request. IP-адрес – Request(«REMOTE_ADDR»). Другие — см.документацию (ASPSamp\Samples\srvvar.asp).

Переадресация

Очень легко написать на ASP скрипт, который будет производить некоторые расчеты, и в зависимости от результатов переадресовывать браузер на разные URL (например, подставлять нужный баннер). Делается это так:

Только надо следить, чтобы до выполнения команды redirect ничего не было записано в Response (даже коментарии HTML).

Электронная почта

Одна из часто встречающихся задач – отправить электронную почту с Web-страницы. На первый взгляд, можно просто написать

Но это приводит к тому, что при отправке формы делается попытка на клиентской машине запустить почтовую программу и создать новое сообщение с данными формы. Если это не получается (почтовая программа не настроена, пользователь не отправил почту, и т.д.) — письмо и не будет отправлено. Гораздо надежнее работает серверное решение.

Для этого существуют внешние компоненты, есть и бесплатные. Например, компонента Jmail от Dimac. Все, что для нее нужно – это адрес SMTP-сервера. Вот пример ее использования:

Публикация проекта ASP.NET с базой данных .mdf

У меня есть проект ASP.NET, и он использует локальную базу данных .mdf, которая хранится в папке App_Data. Обычно я публикую сайт на своем рабочем столе, затем беру все файлы и загружаю их на сервер asp.net.

после успешной загрузки, по каким-то причинам доступ к базе данных невозможен.

Я включил в свой web.config строку подключения для базы данных

не то, что я видел пару онлайн-решений, в которых указывалось изменение LocalDB)\v11.0 на. \SQLEXPRESS; в строке соединения, но это не работает.

Просьба сообщить, как правильно загружать базу данных в проект и устанавливать соответствующий доступ к ней.

когда я пытаюсь открыть соединение с базой данных, я получаю следующее сообщение об ошибке

Глава 4 Взаимодействие с базами данных

Естественно, при разработке сколько-нибудь серьезного сайта нельзя обойтись без системы управления базами данных. Для сайтов, созданных с помощью технологии ASP.NET, самым естественным выбором, пожалуй, будет сервер MS SQL Server 2000. На самом деле можно использовать практически любую СУБД, для которой в системе установлен ODBC-драйвер, но необходимо осознавать, что сервер MS SQL Server 2000 создан Microsoft, как и технология Microsoft .NET, поэтому связь между Web-приложениями и базами данных, функционирующими под управлением MS SQL Server 2000, будет практически прозрачна.

Установка SQL Server 2000 в конфигурации Enterprise на платформы Windows 2000 или Windows XP достаточно тривиальна и не вызывает никаких проблем. После завершения программы инсталляции в вашем меню Programs появится одна или несколько (в зависимости от выбранного комплекта утилит) новых групп программ, а сам SQL Server 2000 успешно стартует, о чем будет сигнализировать соответствующий значок.

В рамках этой главы я не буду рассказывать о настройке и администрировании SQL-сервера, а также о синтаксисе языка SQL. Об этом можно (и нужно) писать отдельные книги. Любой Web-разработчик, если он работает с серверами баз данных, должен представлять хотя бы общий стандарт языка SQL. Поэтому при рассмотрении материала данной главы автор будет исходить из предположения, что с основным синтаксисом SQL читатель знаком.

Естественно, рассмотрение вопросов взаимодействия Web-приложений лучше всего проводить на примере. Чаще всего в литературе рассматривают примеры создания интернет-магазинов. Попробуем взять что-либо не столь распространенное. Например, сетевое агентство знакомств.

Потребуется создать сайт с возможностями поиска по базе данных, а также предусмотреть механизм ввода пользователями информации о себе. Естественно, это будет всего лишь учебный проект, поэтому будем использовать «облегченные» варианты баз данных. А теперь перейдем к непосредственной работе.

Создание базы данных

Прежде всего, необходимо создать саму базу данных, чтобы потом ее можно было подключить к создаваемому Web-приложению. Для этого следует запустить утилиту Enterprise Manager.

В левой части этой утилиты располагается дерево управления SQL-сервером. Необходимо раскрыть папку Databases. Для создания новой базы данных можно воспользоваться встроенным мастером SQL Server 2000, вызов списка встроенных мастеров производится либо нажатием кнопки Run a Wizard (Запустить мастер), располагающейся на основной инструментальной панели утилиты управления сервером, либо при помощи команды меню Tools | Wizards (Сервис | Мастера). При этом будет отображено диалоговое окно Select Wizard (Выбрать мастер),

В списке поставляемых мастеров нас будет интересовать мастер с наименованием Create Database Wizard (Мастер создания базы данных). Он позволяет создавать базы данных в визуальном режиме, без объявления их структуры при помощи SQL-выражения.

После запуска выбранного мастера, будет отображено диалоговое окно первого этапа его работы. Для начала необходимо будет ввести наименование создаваемой базы данных и расположение файлов самой базы данных и log-файла всех транзакций в файловой системе сервера. Внешний вид диалогового окна первого этапа работы мастера показан на рис. 4.3.

Для новой базы данных мы укажем наименование Dating, введя его в текстовое поле Database Name (Имя базы данных). Расположение файлов каждый может задать самостоятельно, это не должно вызывать затруднений. Стоит только заметить, что на используемом логическом диске должно быть достаточно места для наращивания объема данных.

После того, как указано наименование базы данных и расположение требуемых файлов, можно переходить к следующему этапу работы мастера, используя для того кнопку Next (Далее).

На втором этапе работы мастера следует указать начальные размеры файлов создаваемой базы данных. По умолчанию для основного файла, в котором будут храниться данные, предлагается размер в один мегабайт. Можно, конечно, оставить этот размер, предлагаемый по умолчанию, ничего страшного не произойдет. Когда размер файла превысит указанный предел, операционная система выделит для него дополнительное пространство на логическом диске. Однако можно с достаточно большой степенью уверенности предположить, что физически место, располагающееся на диске сразу за файлом с данными, будет занято другой информацией, и к искомому файлу будет добавлена цепочка кластеров, находящаяся на некотором удалении от него. Таким образом, файл не будет располагаться в одной последовательности кластеров, и при чтении данных из файла головка жесткого диска будет достаточно интенсивно перемещаться по диску. Естественно, в настоящий момент при существующих скоростях доступа к данным на жестких дисках величины задержек могут показаться несущественными. Однако следует осознавать, что при достаточно интенсивной работе с сервером баз данных эти задержки будут накапливаться, и, в конце концов, суммарная задержка может составить некоторую ощутимую величину. А если еще учесть, что в нашем случае на машине еще и активно функционирует Web-сервер, который тоже добавляет задержки при приеме и передаче данных, то станет ясно, что разработчику следует учитывать даже доли секунд. Поэтому рекомендуется заранее указать предполагаемый размер файла, содержащего базу данных. В нашем случае должно хватить десяти мегабайт.

После указания размера файла, можно переходить к третьему этапу работы мастера.

Это диалоговое окно позволяет администратору указать порядок увеличения размера файла, содержащего базу данных в том случае, когда его размер все-таки превысит пределы, установленные администратором на предыдущем этапе работы мастера. Для автоматического увеличения размера файла (а это единственный разумный способ управления файлом, так как иначе он просто не будет увеличиваться, и ввод новых данных будет заблокирован) следует выбрать кнопку-переключатель Automatically grow the database files (Автоматическое увеличение размера файлов базы данных). После этого останется лишь указать, как именно будет рассчитываться дополнительный объем, выделяемый файлу. Если выбрать кнопку-переключатель Grow the files in megabytes (Увеличение размера файлов в мегабайтах), то каждый раз файл будет увеличиваться сразу на несколько мегабайт. Размер постоянного приращения можно задать в поле текстового ввода, связанного с данной кнопкой переключателем.

Также можно указать, что размер приращения будет исчисляться в процентах от размера основного файла. Для этого следует выбрать кнопку Grow the files by percent (Увеличение размера файлов в процентах). А в поле, связанном с этой кнопкой переключателем, необходимо задать размер приращения в процентах.

Группа органов управления Maximum file size (Максимальный размер файла) позволяет жестко задавать максимально возможный размер файла, содержащего данные. Как мы уже говорили ранее, неразумно задавать конкретный верхний предел размера файла. Поэтому рекомендуется выбирать кнопку Unrestricted file growth (Неограниченное возрастание размера файла), которая указывает серверу, что размеры файла можно увеличивать до заполнения всего свободного места на логическом диске.

После того, как указана политика увеличения размера файла, содержащего данные, можно переходить к следующему этапу работы мастера. Необходимо сказать, что последующие два этапа работы мастера практически идентичны второму и третьему этапу, когда устанавливались размеры и политика увеличения файла, содержащего данные. Но на четвертом и пятом этапах точно такие же операции будут производиться в отношении log-файла. Следует пояснить, что log-файл чаще всего занимает меньше места, чем файл с данными, однако все зависит от специфики базы данных. И после указания этих параметров мастер создания базы данных завершит свою работу.

Итак, база данных создана, но это еще далеко не все. Необходимо создать еще таблицы, входящие в состав этой базы данных. Для этого необходимо открыть базу данных и активировать группу Tables (Таблицы). В базе данных уже будет находиться несколько служебных таблиц, но нам необходимо сделать свою, в которой будут размещаться данные. Для этого следует выполнить команду меню Action | New Table (Действие Создать таблицу). При этом будет активировано диалоговое окно New Table in ‘Dating’ (Создать таблицу в ‘Dating’),

Создание новой таблицы может проходить как в визуальном режиме, так и при помощи стандартного SQL-скрипта. Естественно, мы рассматриваем всего лишь тестовый пример, поэтому создадим облегченную версию таблицы, в которой будут храниться поля, содержащие имя посетителя (тип VarChar), пол (тип int), адрес электронной почты (тип char), поле, в котором будет храниться информация о пользователе (тип VarChar), поле, содержащее возраст пользователя (тип int). SQL-выражение, создающее подобную таблицу, выглядит следующим образом:

CREATE TABLE [dbo].[Dating] (

[USNAME] [varchar] (50) COLLATE Cyrillic_General_CS_AS NULL ,

[EMAIL] [char] (50) COLLATE Cyrillic_General_CS_AS NULL ,

[ABOUT] [varchar] (1000) COLLATE Cyrillic_General_CS_AS NULL ,

[AGE] [int] NULL , ) ON [PRIMARY]

Итак, база данных создана, и в ней объявлена таблица, в которой будут храниться основные данные. Так как пример будет упрощенным, то нам и не потребуется ничего, кроме этой таблицы.

Теперь рассмотрим структуру сайта, который будет взаимодействовать с созданной базой данных. Нам потребуется Web-страница для установки критерия поиска человека в общей базе данных, и, соответственно, Web-страница для вывода результатов поиска. Также потребуется и еще одна Web-страница, при помощи которой пользователи могли бы вводить данные о себе в базу данных. Вот с разработки этой Web-страницы мы и начнем.

Ввод данных с Web-страницы

Для начала нам придется разработать Web-страницу, при помощи которой пользователи смогут ввести информацию о себе в нашу базу данных. Этой Web-странице мы присвоим наименование «insert.aspx». На ней следует разместить поля текстового ввода и одну группу кнопок переключателей, при помощи которой пользователь будет указывать свой пол. Следовало бы также разместить на этой странице и механизм проверки достоверности, для контроля соответствия введенных данных установленным форматам. Иначе говоря, адрес электронной почты должен хотя бы соответствовать правилам написания этих адресов, а возраст должен быть целым положительным числом, находящимся в разумных рамках (допустим от 14 до 85), но не стоит в данном случае так сильно нагружать страницу органами управления. Как их использовать мы уже знаем, поэтому оставим маленький пример без них.

Итак, HTML-код Web-страницы в режиме разработки приведен в листинге 4.1.

Илон Маск рекомендует:  Что такое код imagecopyresampled
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL