Asp доступ к данным с помощью asp


Содержание

Доступ к данным с помощью ASP.NET, что лучше?

Я задавал себе этот вопрос с момента начала работы в области разработки программного обеспечения,

Каков наилучший способ доступа к данным? Что дает лучшую производительность? Что лучше для ремонтопригодности?

Существует множество решений для работы с базой данных в веб-приложении Asp.Net,

  • Entity framework 4.0
  • Генератор классов с использованием ADO.Net, например Code Author (мне понравилось, как он работает и как он обращается к базе данных с использованием данных блок доступа в Microsoft Enterprise Library).

Завтра я начну новый проект, и я не знаю, какой подход лучше? Любая идея?

Я использую Castle Active Record для доступа к данным в нашем новом проекте ASP.NET. Это отличный и простой инструмент, который построен на NHibernate. NHibernate сам по себе является отличным ORM для .Net.

Нет «лучшего». Есть только предпочтение. Некоторые вроде MVC, некоторые вроде WebForms, некоторые вроде Динамические данные. Entity Framework прекрасно работает, как и LINQ to SQL (хотя я слышал, что один из них устарел, но я нечеткий.) Все хорошо работают.

Лично мне нравятся WebForms, но если я хочу быстрое и грязное приложение CRUD, я всегда выбираю Dynamic Data, и если мне нужна дополнительная функциональность, я могу добавить некоторые стандартные ASPX-страницы WebForm.

Asp доступ к данным с помощью asp

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

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

С уважением,
команда разработчиков eManual.ru

Азы ADO и ASP

FileArea.co.il Азы ADO и ASP
Азы ADO и ASP Майкл Оути
Листинг 1. Применение объекта ADO Соединение
Листинг 2. Использование объекта ADO Набор записей
Листинг 3. Применение объекта ADO Набор записей для вставки строк
Листинг 4. Обработка ошибок ASP и ADO Основы интерактивного WEB-дизайна

Программный продукт ASP, название которого в переводе означает Активные страницы сервера (Active Server Pages), обеспечивает написание сценариев серверной части для информационных WEB-серверов компании Microsoft, IIS (Internet Information Server). Впервые корпорация Microsoft ввела ASP в версии IIS 3.0, и продолжила дальнейшую разработку этого продукта в IIS 4.0. ASP представляет собой гибкое динамичное средство создания WEB-страниц и позволяет применять любой язык написания сценариев, удовлетворяющий стандарту ActiveX. Как правило, ASP использует комбинацию из HTML и встроенного VBScript. IIS включает в себя сервер автоматизации OLE, который исполняет VBScript и посылает результаты реализации сценария в формате HTML клиенту, который может иметь только браузер. Так как сценарии ASP выполняются на сервере, то ASP способен работать с любым WEB-браузером, поскольку браузер получает лишь поток страниц HTML. Понимание того, каким образом объекты ADO работают с ASP, и в особенности того, как лучше применять объекты ADO для поиска и модификации данных, может превратить создание динамических WEB-страниц в легкое и приятное занятие.

Как работает ASP

Рисунок 1. Обзор взаимодействия ASP и HTML
1- WEB-сервер
2- Клиент WEB
3- Активный сценарий
4- пример .ASP

На рисунке 1 изображено, как ASP комбинирует сценарий ActiveX и команды HTML для того, чтобы получить динамическую страницу HTML. Как следует из рисунка, сценарии ASP отличаются от сценариев, базирующихся на браузерах. В традиционных сценариях, основывающихся на браузерах, WEB-сервер посылает страницу HTML, содержащую сценарий ActiveX в браузер клиента, который и отвечает за выполнение сценария. Подход, при котором основной акцент делается на клиентской части приложения, возлагает на нее дополнительный груз обязанностей, что может привести к возникновению проблем, если клиентский браузер не будет в состоянии выполнить сценарий. Напротив, страницы ASP исполняются на WEB-сервере IIS. В ходе исполнения страницы сервер напрямую посылает клиенту команды HTML и все клиентские сценарии, содержащиеся на странице ASP. Но как только сервер доходит до команды серверного сценария ASP, то он исполняет этот сценарий и передает клиенту в форме HTML только полученные в качестве результата выходные данные. Клиент, действия которого сводятся к использованию браузера, не видит разницы между потоком страниц HTML, порождаемым сценарием ASP, и потоком HTML, посылаемым статичными WEB-страницами. Таким образом, написание сценариев для серверной стороны с помощью ASP создает WEB-страницы, которые выступают в качестве исполнителей сценариев. Тот факт, что ASP генерирует только поток страниц HTML, обеспечивает независимость от типа браузера клиента. В силу того, что сервер IIS интерпретирует страницы ASP «на лету», ASP служит идеальным средством для встраивания результатов обработки интерактивных запросов к базе данных в WEB-страницы. Эти возможности обеспечиваются доступом к базе данных SQL Server через ADO непосредственно со страниц ASP.

Будь то доступ из Internet или из местной сети Intranet, клиенты применяют протоколы HTTP и TCP/IP для связи с WEB- сервером IIS. Когда WEB-клиент запрашивает страницу ASP, WEB-сервер IIS сценарии, находящиеся на этой странице. Для того чтобы получить доступ к базе данных SQL Server, сценарий ASP открывает соединение с SQL Server с помощью одного из объектов Соединение, Команда или Набор записей. Затем использует этот объект для передачи в сервер запроса на доступ к данным. SQL Server может размещаться на том же компьютере, что и WEB-сервер IIS. Однако в силу того, что часто SQL Server используется одновременно сразу несколькими различными приложениями, удобнее разместить его на отдельном компьютере, и обеспечить связь с ним через локальную сеть. После того как ядро SQL Server закончит обработку запроса, оно возвращает результаты объекту ADO из сценария ASP. Затем IIS продолжает исполнять сценарий ASP и отсылает поток страниц HTML обратно клиенту. Поэтому обязательно должно существовать сетевое соединение между WEB-сервером IIS и сервером баз данных SQL Server. Кроме того, на WEB-сервере необходимо установить поставщик OLE DB и библиотеки DLL на период прогона ADO.

Использование объектов ADO на страницах ASP

При использовании ADO приложение первым делом пытается применить объекты Соединение, Команда или Набор записей для установления соединения с SQL Server. Объект Соединение следует употреблять для того, чтобы открыть соединение ADO явным образом. Объекты Команда и Набор записей позволяют сделать то же самое динамически. После установления соединения приложение ASP может выполнять команды ADO такого же типа, что и стандартное приложение, написанное на Visual Basic (VB). Эти команды включают исполнение хранимых процедур, открытие и просмотр набора записей, вставку, обновление и удаление данных.

Для подключения страницы ASP к серверу баз данных SQL Server ADO может применять поставщик OLE DB как для ODBC, так и для SQL Server. Поставщик OLE DB для ODBC позволяет использовать структуру объекта ADO с большинством существующих драйверов ODBC. Но поставщик OLE DB для SQL Server дает возможность подключиться только к SQL Server. Однако с объектами ADO Соединение, Команда и Набор записей возможно применять любой из упомянутых поставщиков. Листинг 1 (написанный на языке VBScript) показывает, как применить поставщик OLE DB для ODBC в целях установления соединения с SQL Server.

Первое действие, проводимое в листинге 1, это объявление трех переменных, которые будут содержать имя компьютера, на котором размещен SQL Server, и информации для аутентификации SQL Server. Затем сценарий декларирует переменную cn, которую он в последствии будет использовать для объекта ADO Соединение. После объявления в сценарии рабочих переменных метод Формировать (Form) объекта ASP Запрос (Request) присваивает значения всем этим переменным.

Следующим шагом метод Создать объект (CreateObject) объекта ASP Сервер (Server) создает новый объект ADO Соединение (Connection), который затем присваивается введенной ранее переменной cn. Метод Создать объект (CreateObject) способен порождать экземпляры объектов СОМ. Данный пример иллюстрирует создание экземпляра объекта Соединение ADODB (ADODB.Connection), но его можно аналогичным образом применять и для других структур объектов СОМ, например, для SQL-DMO или Active Directory. (Более подробную информацию об объектах ASP можно найти во врезке «Модель объектов ASP»).

После этого сценарий присваивает значение строки соединения OLE DB свойству Строка соединения (ConnectionString) объекта Соединение, хранящегося в переменной cn. Это позволяет установить соединение без указания имени источника данных, DSN (Data Source Name). В силу того, что спецификация поставщика OLE DB проводилась без ключевого слова PROVIDER, по умолчанию берется поставщик OLE DB для ODBC. Ключевое слово DRIVER идентифицирует тот драйвер, который предполагается применять в дальнейшем. За ключевым словом SERVER указывается имя компьютера, содержащего SQL Server, с которым намереваются установить соединение. За ключевыми словами UID и PWD содержится информация, необходимая для входа в систему. Ключевое слово DATABASE определяет, что в роли базы данных, используемой по умолчанию, будет выступать база данных pubs. После того как будет присвоено значение строки соединения свойству Строка соединения (ConnectionString) объекта Соединение (Connection), его метод Открыть (Open) установит соединение с SQL Server, удовлетворяющее всем значением параметров, заданных в сценарии.

Поиск данных с помощью объекта ADO Набор записей ()

ADO можно применять для поиска данных с помощью объектов Набор записей (Recordset) или Команда (Command). Оба эти объекта способны работать с активным объектом Соединение (Connection), или же создавать новое отдельное соединение. Каждый раз, когда объект Соединение (Connection) или Набор записей (Recordset) устанавливает соединение, начинается новая коммуникационная сессия с SQL Server. Поэтому в том случае, если приложению необходимо выполнить несколько операций, целесообразнее применить объект Соединение (Connection) для открытия связи с SQL Server. Этот объект будет использоваться объектами Команда (Command) или Набор записей (Recordset).

Листинг 2 демонстрирует применение объекта ADO Набор записей (Recordset) на странице ASP. Первая часть сценария во многом напоминает простой пример установления соединения, приведенный в листинге 1. В сценарии сначала декларируются рабочие переменные, а затем им присваиваются значения. После этого по сценарию создается объект Соединение (Connection), и вслед за ним объект ADO Набор записей (Recordset). На следующем шаге сценария строка соединения присваивается объекту ADO Соединение (Connection), и затем для установления связи с SQL Server вызывается метод Открыть (Open). В соответствии со сценарием свойству Активное соединение (ActiveConnection) объекта Набор записей (Recordset), хранящегося в переменной rs, передается значение объекта активного соединения, cn, и выполняется метод Открыть (Open) объекта Набор записей (Recordset). Первый параметр метода Открыть (Open) содержит простой оператор SQL, который выбирает все столбцы и строки из таблицы stores базы данных Pubs.

После того как сценарий возвращает результаты обработки запроса, страница ASP создает таблицу HTML, содержащую шесть столбцов. После этого по сценарию столбцы получают заголовки. Сценарий использует стандарт HTML для построения всех заголовков столбцов. Внутри тела таблицы HTML в соответствии с меткой А листинга 2 программный код VBScript организует цикл Do Until. Этот цикл обрабатывает содержимое объекта Набор записей (Recordset), находящегося в переменной rs. Когда сценарий доходит до конца объекта Набор записей (Recordset), свойство rs.EOF получает значение Истина, и цикл завершается.

Встроенный в страницу ASP сценарий присваивает значения всем столбцам исходя из имени столбца объекта ADO Набор записей (Recordset). В рассматриваемом примере имя столбца, происходящее из таблицы Stores базы данных Pubs идентифицирует каждый пункт коллекции Поля (Fields). Расположенная вслед за этим часть кода VBScript реализует метод MoveNext для перехода к следующей строке в объекте Набор записей (Recordset). Затем оператор Цикл (Loop) возвращает управление в начало цикла Do Until. Когда этот цикл прочитает последнюю строку набора записей, цикл заканчивается и объекты Набор записей (Recordset) и Соединение (Connection), хранившиеся соответственно в переменных rs и cn, закрываются. Результаты работы этой страницы ASP можно видеть на экране 1.

Экран 1. Просмотр простого объекта ADO Набор записей
Изменение данных средствами ADO

ASP и ADO можно применять не только для динамической выдачи WEB-страниц, но и в целях создания WEB-страниц для ввода данных. Такая возможность позволяет создавать основанные на WEB приложения с использованием баз данных, обладающие таким же набором функций работы с базами данных, что и стандартные приложения, разработанные в соответствии с архитектурой клиент-сервер. Объекты ADO Набор записей (Recordset), которые становятся доступными на страницах ASP, предоставляют тот же перечень услуг, что и приложения, написанные на Visual Basic. Как показывает следующий пример, их можно применять для ввода данных. Кроме того, их можно использовать для изменения или удаления данных. Все остальные возможности ADO, такие как способность запускать подготовленные заранее операторы SQL или хранимые процедуры, также имеют место.

В целях внесения изменений в данные возможности, предоставляемые ASP и ADO, можно комбинировать различными способами. К примеру, можно было бы создать страницы ASP, которые будут поддерживать изменяемые объекты ADO Набор записей (Recordset). Они, в свою очередь, смогут применять методы Добавить новый (AddNew), Обновить (Update) и Удалить (Delete) для модификации данных в базах SQL Server. Помимо этого, возможно применять ADO для выполнения как динамических,, так и подготовленных заранее с помощью языка SQL операций модификации данных. Код приведенный на листинге 3, иллюстрирует, каким образом можно было бы добавлять строки в объект Набор записей (Recordset), который создается с использованием курсора Keyset.

Листинг 3 представляет дополнительные технические приемы построения WEB-приложений с помощью ASP. Первая строка является оператором VBScript Option Explicit, который указывает, что все переменные в коде VBScript перед их применением будут явным образом продекларированы. Как и в стандартном Visual Basic, в VBScript предусмотрено автоматическое использование новых переменных, без их предварительного объявления. На первый взгляд это свойство может показаться очень удобным, но в реальности оно служит довольно эффективным способом ввести в разрабатываемое приложение ASP множество трудно находимых коварных ошибок.

Следующим шагом оператором #include вводится файл adovbs.inc. Оператор #include представляет очень удобный путь копирования обычно употребляемых констант на страницы ASP. В данном случае файл adovbs.inc включает все константы, которые обычно содержит структура объекта ADO. Подключение этого файла дает возможность записывать константы в виде adChar и adKeyset, а не в виде значений, представляемых этими константами. Применение констант делает код удобно читаемым и легким в сопровождении. Хотя включение файла является хорошим приемом для средств разработки вообще, но в случае, когда для создания ASP- приложений используется такой инструмент, как Visual InterDev (VID), можно просто добавить в среду разработки VID ссылку на объектную библиотеку ADO. Подобное добавление устраняет необходимость включения файла в ASP- приложения. Чтобы добавить ссылку на ADO в проект VID следует выбрать в меню Проект (Project) и Ссылки проекта (Project References), а затем выбрать в списке доступных ссылок библиотеку Microsoft ActiveX Data Library 2.0.

В соответствии со сценарием VBScript, приведенным на листинге 3, сначала уничтожается, а затем воссоздается заново таблица в базе данных pubs, после чего в эту таблицу вставляются 50 строк и полученное содержимое показывается на WEB-странице. Но прежде чем выполнить все это, в том месте сценария, которое отмечено в листинге 3 буквой А, инициируется обработчик ошибок VBScript. В этом примере оператор On Error применен для того, чтобы обойти любые ошибки, которые могут произойти, к примеру, при попытке удалить несуществующую таблицу из указанной базы данных. В следующем разделе будет более подробно рассмотрено использование обработчика ошибок.

На следующем шаге сценарий ставит в соответствие переменной cn объект ADO Соединение (Connection). Затем метод Исполнить (Execute) объекта Соединение (Connection) выполняет два динамических оператора SQL. Первый уничтожает таблицу Department, а второй создает таблицу Department заново. После создания таблицы Department сценарий устанавливает в свойстве Активное соединение (ActiveConnection) объекта Набор записей (Recordset), указанного в переменной rs, ссылку на этот объект Соединение (Connection). Затем метод Открыть (Open) объекта Набор записей (Recordset) создает обновляемый набор записей. Константа adOpenKeyset определяет, что этот объект будет относиться к обновляемому типу Keyset, а константа adLockOptimistic предписывает использование оптимистического типа блокировки записей.

Цикл For Next вставляет 50 строк в таблицу Department. В этом цикле метод Добавить новый элемент (AddNew) создает буфер для хранения новой строки, после чего цикл присваивает значения объектам ADO Поле (Field). Каждый объект коллекции Поле (Field) идентифицируется по названию столбца. Значение счетчика цикла присваивается столбцу Dep_Id, содержащему идентификатор отдела, а в столбец Dep_Name с названием отдела помещается литерал Department и представленный в виде символьной строки номер отдела, равный значению счетчика цикла. Цикл вставляет новую строку в базовую таблицу в ходе исполнения метода Обновить (Update) объекта Набор записей (Recordset).

После того как сценарий вставит 50 строк в таблицу Department, метод Перейти к первой () перемещает курсор в начало объекта Набор записей (Recordset). Затем содержимое объекта Набор записей (Recordset) представляется в виде таблицы HTML, применяя ту же технику, что и в описанном ранее примере с запросом. На экране 2 показана WEB- страница, которая создается при запуске данной страницы ASP.

Экран 2. Просмотр записей, введенных на страницу ASP
Обработка ошибок ASP и ADO

Очень важно перехватывать ошибки, возникающие во время работы приложения: если вдруг в результате некорректного функционирования WEB-приложения системой будет сгенерировано сообщение об ошибке, то работа WEB- приложения будет немедленно прекращена. Для того чтобы предусмотреть на странице ASP специальную часть сценария VBScript, отвечающую за обработку возникающих ошибок, применяется оператор On Error. К сожалению, оператор On Error не обладает всей полнотой возможностей обработчика ошибок VB, который позволяет перейти в отдельную секцию кода для обработки информации об ошибке. Оператор On Error, входящий в VBScript, предоставляет только следующую альтернативу: либо перейти к следующей операции (Resume Next), либо вообще отключить обработку ошибок. Этот оператор не дает возможности перейти к другим секциям кода. Оператор On Error использует структуру объекта ADO для того, чтобы поместить ошибки, возникающие во время выполнения WEB-приложения на базе страниц ASP, в коллекцию объекта ADO Ошибка (Error). Коллекцию ошибок ADO можно обрабатывать с целью сбора дополнительной информации о том, какие ошибки встречаются при эксплуатации вашего приложения. Фрагмент кода, приведенный на листинге 4, показывает, как использовать обработчик ошибок VBScript и каким образом извлекать информацию из объекта ADO Ошибка (Error).

Обработку ошибок в листинге 4 обеспечивает оператор On Error. Затем для создания локального объекта ADO Соединение (Connection) по сценарию используется объект Соединение (Connection), который хранился в объекте ASP Сессия (Session). После этого в сценарии используется метод Выполнить (Execute) объекта ADO Команда (Command) применительно к заведомо неправильному имени таблицы. Поскольку обработка ошибок разрешена, программа переходит к следующему оператору.

Проверка свойства Счетчик (Count) коллекции объектов Ошибка (Error) позволяет найти ошибки ADO. Если значение счетчика больше нуля, значит, объект ADO столкнулся с какой- либо ошибкой во время исполнения. Извлечь информацию об ошибках ADO можно путем итеративного просмотра коллекции объектов Ошибка (Error). Пример на листинге 4 использует цикл For Each для обработки элементов коллекции ошибок объекта ADO Соединение (Connection). Свойства Номер(), Источник () и Описание () становятся доступными в форме текстов HTML. Экран 3 представляет страницу с результатами обработки ошибок. (Обратите внимание на то, что рассмотренный пример является не более чем демонстрацией подхода. В реальном приложении необходимо обрабатывать условия возникновения ошибок в коде приложения. При этом следует избегать вывода ошибок на браузер конечного пользователя).

Экран 3. Обработка ошибок ASP с помощью ADO

В том случае, когда на WEB-страницу должны выводиться только статичные данные, целесообразно применять Мастер WEB-приложений (), входящий в состав SQL Server. Он поможет легко и быстро преобразовать информацию базы данных SQL Server к виду WEB-страницы формата HTML. Если же необходимо создать по-настоящему интерактивное приложение, способное динамически представлять и обновлять данные, лучше всего применять комбинацию ASP и ADO, что позволит подключить вашу базу данных SQL Server к сети WEB. Использование ADO и ASP дает возможность создавать WEB-приложения, обладающие теми же функциями, что и их предшественники, выполненные в соответствии с традиционной архитектурой клиент-сервер.

В основу этой статьи лег адаптированный материал из книги Майкла Оути и Поля Конте «Руководство по разработке для SQL Server 7.0».

Майк Оути (mikeo@teca.com) работает старшим техническим редактором в журналах SQL Server Magazine и Windows NT и является президентом компании ТЕСА. Эта компания занимается разработкой программного обеспечения и консалтингом; находится в Портленде, штат Орегон.

Модель объектов ASP

Информационный сервер Интернет, IIS (Internet Information Server), разработанный корпорацией Microsoft, вводит Активные серверные страницы, ASP (Active Server Pages), в качестве автоматического сервера OLE, обладающего иерархической структурой объекта. На рисунке А представлена модель объекта ASP. Первичным объектом в программной модели ASP является объект Контекст сценария (ScriptingContext), который обеспечивает взаимодействие с браузером клиента. Поскольку объект Контекст сценария (ScriptingContext) всегда доступен приложениям ASP, то нет необходимости в явном виде делать на него ссылку. Объект Контекст сценария (ScriptingContext) содержит шесть основных объектов ASP: пять встроенных объектов и объект Контекст объекта (ObjectContext). К пяти встроенным объектам относятся: объект Приложение (Application), объект Запрос (Request), объект Сервер (Server), объект Сессия (Session) и объект Отклик (Response).

Все активные WEB-сессии применяют объект Приложение (Application) для того, чтобы все пользователи могли одновременно обращаться к информации приложения ASP. Объект Приложение (Application) включает две коллекции: Содержание (Context) и Статические объекты (StaticObjects). Каждый объект Содержание (Context) соответствует какому- либо пункту, для включения которого в WEB-приложение были использованы команды ActiveX. Коллекция Статические объекты (StaticObjects) содержит все объекты, для включения которых в WEB-приложение применялись ярлыки HTML . Кроме того, объект Приложение (Application) может также содержать определяемые пользователем объекты, которые были созданы этим WEB-приложением и предназначены для коллективного применения.

Объект Запрос (Request) получает запросы от клиентов сети WEB. Объект Запрос (Request) может вместить всю информацию содержащуюся в форме, плюс сведения о текущем пользователе. Этот объект включает несколько коллекций, каждая из которых представляет различные информационные наборы, которые могут возвращаться клиентам WEB в ответ на их запросы. Каждый объект Сертификат клиента (ClientCertificate) в одноименной коллекции представляет поле сертификата, которое возвращает клиент сети WEB и которое в дальнейшем служит его идентификатором. Коллекция (Cookies) состоит из элементов, каждый из которых содержит немного информации о пользователе WEB. Коллекция Формы (Forms) включает набор объектов, каждый из которых представляет какую-нибудь форму HTML. Коллекция Строка запроса (QueryString) содержит набор добавляемых аргументов URL, а коллекция Переменные сервера (ServerVariables) представляет собой набор переменных, описывающих серверное окружение.

Объект Сервер (Server) применяется для создания объектов OLE, которые было бы желательно иметь в WEB-приложении. Например, метод Создать объект (CreateObject) объекта Сервер (Server) генерирует объекты Соединение (Connection) и Набор записей (Recordset), обеспечивающих доступ к базам данных SQL Server.

Объект Сессия (Session) поддерживает информацию, относящуюся к текущей сессии в сети WEB. Объект Сессия (Session) во многом похож на объект Приложение (Application), но имеет отличие от него. В то время как объект Приложение (Application) принадлежит всем пользователям сети WEB, объект Сессия (Session) относится только к текущей сессии. Коллекция объектов Содержание (Context) объекта Сессия (Session) включает все пункты, которые добавлялись в WEB-сессию с помощью команд сценария. Объект Контекст объекта (ObjectContext) обеспечивает доступ к контексту текущего объекта. Как правило, он порождает экземпляры объектов MTS или контролирует транзакции базы данных.

Объект Отклик (Response) записывает информацию в виде потока страниц HTML и отсылает ее в браузер клиента. Объект Отклик (Response) также поддерживает коллекцию, состоящую из объектов, содержащих сведения, которые могут быть записаны в систему клиента. Они в последствии могут быть прочитаны объектом Запрос (Request).

Рисунок А. Модель объектов ASP
1 — Контекст сценария
2 — Приложение
3 — Содержание
4 — Статические объекты
5 — Определяемые пользователем объекты
6 — Контекст объекта
7 — Запрос
8 — Формы
9 — Строка запроса
11 — Сервер
12 — Сессия
13 — Отклик

Доступ к данным с NHibernate

Данная глава охватывает следующие темы:

  • Разъединение механизмов доступа к данным из ядра и из пользовательского интерфейса
  • Настройка NHibernate преобразований
  • Начальная загрузка NHibernate
  • Вызов механизма доступа к данным из ASP.NET MVC

Даже если ASP.NET MVC Framework фокусируется на уровне представления, многие разработчики работают с небольшими приложениями, для которых не нужны несколько уровней бизнес-логики, а также не требуется разделение между уровнем представления и хранением данных. Некоторые из этих образцов имеют только небольшое количество простых экранов, которые хранят и извлекают данные из небольших баз данных. Для таких приложений могут подходить простые шаблоны разделения, но многие небольшие приложения со временем становятся все больше по сравнению с тем, какими они были определены первоначально. Когда такое случается, концепция разделения является крайне необходимой для долгосрочной поддержки программного обеспечения в рабочем состоянии.

Для того чтобы достичь концепции разделения при взаимодействии с реляционной базой данных, вы можете воспользоваться таким инструментом объектно-реляционного преобразования (ORM), как популярный NHibernate проект с открытым исходным кодом. Вы видели, что в рамках NuGet вы можете использовать множество библиотек и фреймворков, которые создаются разработчиками по всему миру. NHibernate – это одна из библиотек, доступных посредсвом NuGet. Эта библиотека делает тривиальным процесс доступ к данным в рамках реляционных баз данных.

ASP. Основы. Объекты и компоненты. Доступ к базам данных

Dynamic HTML представляет собой основное средство программирования клиента для Microsoft Internet Explorer 4.0 и выше, но такие программы просмотра Web, как Netscape Navigator, не поддерживают Dynamic HTML. На самом деле очень малая часть функциональности клиентской части, поддерживаемой различными программами просмотра, может рассматриваться как действительно кросс-платформенная.

Если Вы хотите разработать Интернет-узел, открытый для доступа самым различным программам просмотра, то должны перенести программирование с клиента на сервер. Такую возможность предоставляют Microsoft ASP (Active Server Pages — активные серверные страницы). По сути ASP не что иное, как сценарий на VBScript, который исполняется на сервере. Когда запрашивается страница, этот сценарий порождает HTML-текст. Это ключевая особенность ASP — клиент никогда не видит вашего кода, а только результирующий HTML, который воспринимает любая программа просмотра.

Листинг 4.1 демонстрирует простую ASP-страницу, которая создает приветствие в соответствии со временем суток. В нем текущий час определяется при помощи кода Hour(Now), где Now — функция VBScript, возвращающая текущий момент времени и дату. Если текущий час меньше 12, то приветствие задается в форме «Доброе утро!» От полудня до шести вечера сообщение имеет вид «Добрый день!», а после шести — «Добрый вечер!»

Листинг 4.1.Простой пример ASP.


Simple ASP Example

11 And Hour(Now) 17 Then

strGreeting = «Добрый вечер!»

Обратите внимание на код в листинге, окруженный специальными символами: угловыми скобками и знаками процента ( ). Такие символы означают, что это серверный код, который выполняется перед тем, как страница будет на самом деле послана программе просмотра. Если бы Вы посмотрели в Internet Explorer на результирующий HTML-текст, то увидели бы следующее (в предположении, что сейчас еще не вечер, но уже не утро):

Simple ASP Example

В этом-то и состоит суть ASP. Результат исполнения кода — обыкновенный HTML! Эту страницу можно просматривать любой программой просмотра: не только Internet Explorer, но и, например, Netscape Navigator. Иными словами, ASP предоставляет разработчику подлинную платформенную независимость

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

Скорее всего, Вы будете писать свои сценарии на VBScript, но ASP поддерживает и JavaScript. В отличие от сценариев на клиентской стороне, здесь выбор языка абсолютно не создает проблем совместимости с различными программами просмотра, поскольку весь код исполняется на сервере.

А теперь обратите внимание на ту строку, где и происходит генерация HTML-текста. Здесь для вывода приветствия используется переменная:

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

Объекты и компоненты.На самом простом уровне создание ASP-страницы — это ни что иное, как написание серверного кода для получения ожидаемого результата. Но VBScript не является полнофункциональным языком и, как только Вы приступаете к построению более сложных страниц, его выразительных средств начинает не хватать. Так, в VBScript нет встроенных функций доступа к данным; не умеет он и открывать текстовые файлы. Собственно говоря, в VBScript отсутствуют какие-либо встроенные средства доступа к каким бы то ни было внешним источникам данных. Так как же в таком случае при помощи ASP выполняются такие сложные действия, как доступ к данным? Ответ будет таким: нужно дополнить VBScript объектами и компонентами ASP.

ASP-объекты и компоненты — это не что иное, как компоненты ActiveX, подобные обычным DLL ActiveX, с которыми Вы наверняка работали в Microsoft Visual Basic. Различие между объектами и компонентами ASP состоит в том, каким образом они появляются в программе. ASP-объекты — это элементы управления ActiveX, которые в коде на VBScript доступны всегда: их не нужно создавать явно. В число объектов ASP входят Application, Session, Request, Response и Server. А вот ASP-компоненты представляют собой DLL, существующие вне структуры ASP. Эти компоненты могут быть написаны на любом языке, а некоторые по­лезные ASP-компоненты просто поставляются в комплекте с Visual InterDev. ASP-компо­ненты нужно явно создавать в коде. ASP поддерживает компоненты Database Access, File Access, Browser Capabilities, Ad Rotator и Content Linking.

Файл GLOBAL.ASA.Одна из главных трудностей разработчика для Интернета, независимо от того, какую технологию он использует, состоит в том, как сложно создать в Интернете настоящее приложение. Взаимодействие программы просмотра и Web-сервера представляет собой по сути лишенную состояния транзакцию, в ходе которой сервер посылает клиенту Web-страницу и затем забывает о его существовании. Когда клиент запрашивает другую Web-страницу, сервер ничего не помнит о предыдущем запросе. Коренная проблема для всех Web-приложений такова: как показать, что это именно приложение?

Определить приложение в среде Microsoft Windows довольно просто. Приложение запуска­ется двойным щелчком значка и завершается, когда в меню File выбран пункт Exit. В проме­жутке между двумя этими событиями данные хранятся в переменных. Но для Интернет-при­ложений это не так. Как определить, когда приложение начинается, а когда заканчивается? Можно сказать, что приложение начало работу, если пользователь зашел на узел и просмат­ривает одну из его страниц. Но что если он переходит к другому узлу, а через пять минут возвращается? Приложение все еще активно? А если пользователь отсутствовал час или два?

Проблема определения моментов запуска и завершения приложения оказывает серьезное влияние на правильное управление переменными и последовательностью выполнения. К счастью, ASP предлагает решение. Оно состоит в том, что для определения начала и завер­шения — как всего приложения, так и отдельных пользовательских сессий — используется специальный файл под названием GLOBAL.ASA. На этот файл возложено реагирование на четыре ключевых события узла: Application_OnStart (запуск приложения), Application_OnEnd (завершение приложения), Session_OnStart (начало сессии) и Session_OnEnd (завершение сессии). В листинге 4.2 приведен типичный файл GLOBAL.ASA.

Листинг 4.2.Файл GLOBAL.ASA.

Для обозначения разделов сценария GLOBAL.ASA содержит теги

Хотя GLOBAL.ASA отмечает начало и завершение приложения при помощи событий, оста­ется неясным, что же все-таки составляет собственно приложение. Одна из рабочих форму­лировок, предложенная Microsoft, определяет Интернет-приложение как виртуальный ката­лог со всеми его файлами. Если пользователь запрашивает Web-страницу из виртуального каталога под названием Bookstore, то тем самым он запускает приложение Bookstore, и в GLOBAL.ASA возбуждаются события Application_OnStart и Session_OnStart.

Согласно этому определению с приложением одновременно могут работать несколько про­грамм просмотра. Но событие Application_OnStart происходит только один раз: когда первый пользователь запрашивает Web-страницу из виртуального каталога. Когда затем страницы из этого ката­лога запрашивают другие пользователи, возбуждается только событие Session_OnStart.

В то время как приложение может относиться к нескольким программам просмотра, обра­щающимся к одному и тому же множеству Web-страниц, сессия касается какой-то одной программы просмотра, обращающейся к тем же Web-страницам. Для конкретной программы просмотра сессия длится, пока программа продолжает запрашивать страницы виртуального каталога. Если же пользователь не запрашивает Web-страницы (из данного виртуального каталога) на протяжении 20 минут (по умолчанию), сессия завершается, и возбуждается событие Session_OnEnd. Когда в данном виртуальном каталоге завершаются все сессии, возбуждается событие Application_OnEnd.

В качестве примера рассмотрим следующий сценарий. Два пользователя намереваются посе­тить на Web-узле приложение Magazine. Пользователь 1 оказывается проворнее и быст­ренько запрашивает Web-страницу DEFAULT.ASP. Тут же возбуждаются события Application_OnStart и Session_OnStart. Буквально пятью минутами позже к приложению обращается пользователь 2. Поскольку пользователь 1 как-то проявлял себя в течение последних 20 минут, приложение Magazine активно. Следовательно, возбуждается только событие Session_OnStart, сигнализируя о начале новой сессии. Кроме того, теперь для завершения приложения необходимо, чтобы завершились обе сессии.

В течение следующих 15 минут пользователь 1 не запрашивает ни­каких страниц приложе­ния Magazine. Поскольку он не проявлял активности на протяжении 20 минут, ASP приходит к выводу, что пользователь 1 закончил свою работу с приложением, и возбуждает событие Session_OnEnd. Но приложение все еще активно, поскольку в течение последних 20 минут к нему обращался пользователь 2.

Пользователь 2 работает с приложением еще час, то и дело запрашивая новые Web-страницы. Но в конце концов он отключается, а через 20 минут после того, как он покинул узел (точнее, в последний раз запросил Web-страницу приложения), возбуждается событие Session_OnEnd. Поскольку пользователь 2 был последним пользователем данного приложения, оно завершается, и возбуждается событие Application_OnEnd.

В ASP есть несколько встроенных объектов, которые доступны разработчику. Эти объекты помогают управлять многими вещами: от переменных, до передачи форм. Работать с ними легко, они вызываются из кода напрямую без какого-то особого синтаксиса.

Объект Application.Объект Application (приложение) позволяет создавать переменные приложения (application variables) — переменные, доступные всем пользователям данного приложения. Все, кто обращается к Web-страницам данного виртуального каталога, могут совместно использовать любую переменную приложения определенную для этого каталога.

В листинге 4.3 приведен пример программы, которая использует Объект Application. В нем переменная приложения служит для отслеживания времени последнего обращения к страницам приложения.

Листинг 4.3.Объект Application.

Эта страница последний раз посещалась:

Создание переменной приложения сводится к адресации объекта Application именем новой переменной, которую вы хотите создать. Например, следующий код создает новую переменную приложения с именем Company и присваивает ей значение NewTech.

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

Поскольку такие переменные доступны нескольким пользователям одновременно, вы не сможете гарантировать, что два пользователя не попытаются одновременно присвоить одной и той же переменной разные значения. Для разрешения подобных коллизий объект Application поддерживает методы Lock и UnLock. Метод Lock блокирует весь объект Application, а не только переменную, вы хотите изменить, поэтому сразу же после изменения значения переменной разблокируйте объект:

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

Объект Session.Зачастую разработчиков меньше интересуют данные, совместно используемые несколькими пользователями, зато гораздо больше — данные, связанные с конкретным пользователем. ASP поддерживает переменные для индивидуального пользователя при помощи объекта Session (сессия), который позволяет создавать переменные сессии (session variables).

Листинг 4.4 демонстрирует, как определить несколько переменных сессии в файле GLOBAL.ASA. Само по себе их определение так же просто, как и в случае переменных приложения. Все, что нужно сделать — это адресовать объект Session именем переменной, которую вы хотите создать. Основное различие между переменными этих объектов — их области видимости. Переменные сессии предназначаются для одного пользователя и живут, пока пользователь поддерживает сессию. Как только в течение 20 минут (по умолчанию) пользователь не обращается к страницам данного виртуального каталога, данные пропадают.

Листинг 4-..Создание переменных сессии.

Переменные сессии можно создавать на любой Web-странице или в файле GLOBAL.ASA, а доступны они на любой Web-странице приложения, в котором эти переменные были первоначально созданы. Получить значения переменных сессии можно, считывая их из объекта Session. Следующий фрагмент кода считывает переменные сессии, созданные в листинге 4.4, и выводит их в полях ввода:

Ранее мы определили Интернет-приложение как лишенные статуса транзакции между Web-сервером и программой просмотра. Как же тогда ASP запоминает переменные сессии для каждого пользователя приложения? Ответ будет таким: эти переменные сохраняются на сервере для каждого клиента. Программа просмотра получает от сервера уникальный идентификатор, позволяющий определить, какой набор переменных кому принадлежит. Клиент этот идентификатор (Globally Unique Identifier, GUID) сохраняет, а впоследствии посылает серверу и получает именно ему предназначенные данные. Таким образом каждый клиент может иметь свой набор данных в каждом Интернет-приложении.

Осталось сказать, что для установки или считывания впемени жизни сессии (в минутах) применяется свойство Timeout объекта Session:

Объект Request.Для передачи данные клиенту создается Web-страница, а для передачи данных в обратном направлении программа просмотра использует отправку формы (form submission). В форме содержатся текстовые поля, переключатели и т.п. Клиент размещает введенные данные в этих полях и пересылает пакет серверу. Процессом передачи формы управляют два атрибута тега

Элемент формы с типом SUBMIT — это кнопка, нажатие которой пользователем заставляет программу просмотра упаковать данные формы и отправить их. Формат пересылки данных определен строго и сервер знает, чего ожидать от клиента. Данные имеют вид пар Поле=Значение, отсылаемых серверу в формате открытого текста. Если в предыдущем примере ввести в поле Name NewTech и info@newtech.com в поле Email, то сценарию DATA.ASP будет послан следующий текст:

На сервере эти данные можно вновь разобрать по полям и использовать в любых целях. Вот тут-то и нужен объект Request. Он используется в ASP для разбора полученных от клиента данных. Для работы с объектом Request просто сообщите ему имя поля, значение которого хотите получить, и объект вернет вам это значение. Например, следующий код вернет вам значение поля Name:

Request.Form применяется, когда данные были отправлены методом POST и именно этому сценарию. Если для отправки данных используется метод GET или сценарий вызывается с передачей параметров прямо в гиперссылке

то для разбота данных применяют свойство Request.QueryString, который работает так же, как Request.Form. Следующий фрагмент кода вернет значение поля Name из гиперссылки:

Другое свойство — Request.Cookies используются для извлечения информации из кукисов (cookies), отосланных вместе с запросом строке пользовательского агента программы просмотра. А листинг 4.5 демонстрирует применение свойства ServerVariables для определения имени компьютера, с которого клиент вызвал сценарий.

Листинг 4.5.Определение компьютера пользователя.

Вы вошли с компьютера

Переменные сервера представляют широкий круг информации о клиенте и Web-сервере. Доступ к каждой конкретной переменной сводится к чтению соответствующей переменной.

Объект Response.Этот объект управляет содержимым страницы, которую ASP возвращает программе просмотра. Фактически в комбинации знак равенства представляет собой сокращенное обозначение метода Write объекта Response. Так что следующие две строки кода эквивалентны:

Поскольку объект Response используется очень часто, такое сокращение оправдано.

Полезное свойство объекта Response — Expires. Оно задает время (в минутах) за которое страница устаревает. Если установить его в нуль, то страница будет устаревать в момент загрузки и Internet Explorer не будет ее кэшировать. Кэширование сильно влияет на разработку и может привести к тому, что приложение будет функционировать неправильно. IE кэширует страницы двумя способами: на диске и в памяти. Рассмотрим такой фрагмент кода, показывающий текущее время и дату:

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

Листинг 4.6.Страница, устаревающая уже в момент загрузки.

Forcing a Page to Expire

Еще один полезный метод объекта Response — Redirect, перенаправляющий программу просмотра на указанный URL:

Объект Server.Объект Server (сервер) представляет собой в некотором роде свалку — в том смысле, что предоставляемые им функции никак не связаны между собой, за тем исключением, что все они полезны разработчику для Интернета. Пожалуй, самая важная из всех функций объекта Server — это метод CreateObject, который создает экземпляр компонента ActiveX. Причем это может быть как встроенный компонент, входящий в комплект поставки, так и тот, который написали Вы сами на любом языке. В любом случае использование компонента ActiveX на сервере требует вызова метода CreateObject.

Аргументом метода CreateObject служит ProgID (программный идентификатор) требуемого компонента ActiveX. ProgID — это содержательное имя компонента, такое как Excel.Sheet или Word.Basic. Следующая строчка показывает, как при помощи CreateObject создать экземпляр компонента с ProgID Excel.Sheet.

Set MyObject = Server.CreateObject(«Excel.Sheet»)

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

Компоненты ASP — это на самом деле просто компоненты ActiveX, наподобие тех, что Вы можете сами создать на Visual Basic или Visual C++. Но эти компоненты написаны Microsoft и поставляются вместе с Visual InterDev. Они предназначены для выполнения полезных для Web-узлов задач общего характера, включая доступ к данным. Создать их на своей странице Вы можете при помощи метода CreateObject объекта Server, а как только они созданы, смело обращайтесь к их свойствам и методам для выполнения нужных Вам задач.

Компонент ActiveX Data Objects.Самым полезным изо всех компонентов ASP следует признать компонент доступа к базам данных, называемый также ActiveX Data Objects, или сокращенно ADO. Он и содержащиеся в нем объекты применяются для чтения и записи данных в источники данных ODBC при публикации в Web информации из баз данных.

Объект Connection (подсоединение) создается методом CreateObject объекта Server, и ссылка на него помещается в переменную. Когда объект создан, его можно использовать для открытия подсоединения к любому источнику данных ODBC. Следующий фрагмент кода устанавливает подсоединение к источнику данных ODBC с названием Publications:

‘ Создаем объект Connection

Set objConnection = Server.CreateObject(«ADODB.Connection»)

‘ Открываем подсоединение к источнику данных

objConnection.Open «Publications», «sa», «» %>

Здесь objConnection — переменная для объектной ссылки на экземпляр объекта Connection. Метод Open устанавливает подсоединение, принимая в качестве аргументов имя источника данных, идентификатор пользователя и пароль.

Когда подсоединение установлено, получать информацию из источника данных можно при помощи объекта Recordset (набор записей). Этот объект умеет выполнять оператор SELECT языка SQL и возвращать набор записей, удовлетворяющих этому запросу. Как и объект Connection, Recordset создается методом CreateObject. В следующем примере программа выполняет оператор SELECT над источником данных, представленным переменной objConnection:

После того, как записи получены, для передвижения по ним можно обращаться к методам MoveFirst, MoveLast, MoveNext и MovePrevious. Затем метод Write объекта Response помещает данные на Web-страницу, которая и посылается программе просмотра. В листинге 4.7 приведен полный пример ASP-страницы, которая строит список пользователей, со­держащихся в источнике данных Data.


Листинг 4.7.Построение списка при помощи ADO.

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

Выход состоит в разбиении на страницы (paging). Этот механизм реализован во всех поисковых системах для передачи за один раз некоей порции результатов запроса, скажем, из 10 записей. Теперь пользователь может эффективно работать с полученной информацией. Поддерживает разбиение на страницы и ADO — посредством нескольких свойств объекта Recordset: PageSize, PageCount и AbsolutePage.

При получении набора данных можно указать, что записи следует разбить на страницы. Количество строк набора данных, составляющих страницу, задается значением свойства PageSize. Затем можно определить общее количество страниц в наборе данных посредством свойства PageCount. А доступ к заданной странице обеспечивает свойство AbsolutePage.

В листинге 4.8 приведен полный пример, в котором пользователь может просматривать 10 записей за раз. Переменная сессии CurrentPage отслеживает текущую страницу. Пользователь может перейти к предыдущей порции данных или к следующему набору из 10 записей, выбрав одну из двух гипертекстовых ссылок на странице.

Листинг 4.8.Разбиение набора данных на страницы средствами ADO.

Работа с данными в ASP.NET. Создание DAL (Data Access Layer)

За основу для данной статьи, я взял статью «Creating a Data Access Layer» ( http://www.asp.net/learn/data-access/tutorial-01-cs.aspx )

Я её попытался перевести, так как знания английского у меня не на самом хорошем уровне, но главное я понял как ОНО работает и попытаюсь об этом поведать вам. Буду придерживаться плана оригинальной статьи, но стиль написания местами поменяю.

Введение

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

Эта статья первая в своей серии «Работа с данными в ASP . NET «, в которой я буду описывать различные техники работы с данными в ASP . NET . В данной статье я опишу процесс создания приложения, использующего Typed DataSets .

Для изучения материала данной статьи вам необходимо иметь Microsoft SQL Server 2005 Express Edition или выше и базу данных Northwind , которую вы можете скачать с сайта Microsoft ( http :// www . microsoft . com / downloads / detail . aspx ? Family >=06616212-0356-46 A 0-8 DA 2- EEBC 53 A 68034& displaylang = en ), также вам необходимо иметь на своем компьютере Microsoft Visual Studio , или хотя бы Microsoft Visual Web Developer Express (можно найти на сайте Microsoft ) версии 2005 или 2008 (может и выше, по крайней мере на момент написания этой статьи у меня стоит Visual Web Developer Express 2008)

Если у вас есть все необходимое, то наберитесь терпения и. Поехали!

Первый шаг. Создание проекта и подключение к базе данных

Для того, чтобы нам создать наш Data Access Layer ( DAL ), нам необходимо создать проект в Visual Studio (или Visual Web Developer Express , здесь и далее просто VS ). Для этого, откройте программу, перейдите в меню » File » и выберите пункт » New Web Site …». Укажите шаблон » ASP . NET Web Site «, » Location : File System » и выберите произвольный путь, или если у вас установлен и настроен IIS , то » HTTP » (лично я делал вторым способом, как установить и настроить IIS я расскажу в другой раз, воспользуйтесь http :// www . google . com / ), и укажите используемый язык в C # (» Language : C #»).

Рисунок SEQ Рисунок \* ARABIC 1. Создание ASP . NET приложения

После нажатия на кнопку » OK «, VS автоматически создаст проект, содержащий стартовую страницу Default . aspx и директорию App _ Data .

Теперь, когда сайт создан нам необходимо добавить к нему базу данных Northwind с помощью Server Explorer в VS . С помощью Server Explorer вы можете совершать манипуляции с базой данных, например, создавать, изменять или удалять таблицы, хранимые процедуры, представления и все это прямо в VS . Вы также можете просмотреть содержимое таблиц и создать собственные запросы, в том числе в графическом режиме, используя Query Builder .

При создании TypedDataSet нам будет необходимо показать VS базу данных, по образу которой будет построен наш Typed DataSet .

Добавление базы данных к проекту и подключение к ней

Во введении я говорил, что для проекта нам необходима база данных Northwind , если вы еще её не скачали её или не установили, сделайте это сейчас.

Для того, чтобы добавить базу данных в проект, откройте Solution Explorer (все указанные меню и утилиты находятся в меню » View «). Кликните правой кнопкой мыши по папке » App _ Data » и выберите пункт » Add Existing Item …», в появившемся диалоговом окне укажите файл » NORTHWIND . MDF «, у меня он лежал в директории «C:\SQL Server 2000 Sample Databases».

Теперь откройте Server Explorer , в разделе Data Connections должна появиться база данных Northwind , если этого не произошло, то нажмите правой кнопкой мыши на пункте » Data Connecions » и выберите » Add Connection «, в появившемся окне смените Data Source на » Microsoft SQL Server Database File ( SqlClient )» и укажите местонахождение файла NORTHWIND . MDF . Нажмите » OK «.

Теперь у вас наверняка должна появиться база данных Northwind в списке Data Connections . Теперь вы можете посмотреть содержимое базы данных, таблиц, выполнить запросы и прочая, и прочая.

Рисунок SEQ Рисунок \* ARABIC 2. База данных в Server Explorer

Второй шаг. Создание Data Access Layer

Для начала разберемся, что же такое Data Access Layer . Любое приложение, которое работает с данными, включает в себя так называемый уровень представления , в web -приложениях это страницы, которые показывают эти данные. Естественно, что для того, чтобы данные можно было представить, в прложении должна быть реализована логика обработки данных. В ASP . NET это может быть реализовано с помощью написания кода ADO . NET в страницах или использования элемента управления SqlDataSource или еще каким либо образом. В любом случае приложение будет содержать в себе логику доступа к данным . Рекомендуется логику доступа к данным вынести из уровня представления в отдельный — уровень доступа к данным , Data Access Layer ( DAL ). Все выгоды такого подхода очень хорошо описаны, в конце статьи я укажу ссылки на другие статьи, описывающие эти выгоды.

Любой код, который осуществляет обработку данных, их выборку, изменение, команды SELECT , INSERT , UPDATE , и DELETE и прочие, должен находиться в DAL . Уровень представления не должен содержать в себе никакого кода обращения к базе данных, все данные в нем должны браться из DAL . База данных Northwind , взятая в качестве примера, содержит в себе такие таблицы, как Products и Categories , в которых хранится информация о товарах и о категориях, к которым они принадлежат. В нашем DAL мы должны описать следующие методы:

· GetCategories (), который выдаст информацию обо всех существующих в базе данных категориях

· GetProducts (), который выдаст информацию обо все существующих товарах

· GetProductsByCategoryID ( categoryID ), который выдаст информацию обо всех продуктах, принадлежащих определенной категории

· GetProductByProductID ( productID ), который выдаст информацию об определенном товаре

Указанные методы выполнят подключение к базе данных, выполнят запрос и вернут полученный результат. То, в каком виде они вернут результат является очень важным! Эти методы могут вернуть стандартный DataSet или DataReader , заполненный данными из таблицы, но лучше будет, если они вернут strongly-typed objects (Если честно, не знаю как это переводится) . A strongly-typed object is one whose schema is rigidly defined at compile time, whereas the opposite, a loosely-typed object, is one whose schema is not known until runtime.

Например, DataReader или DataSet (используемый по умолчанию) имеют очень грубую структуру, т.к. она уже определена и при выполнении запроса такой объект просто заполняется результатом. Предположим мы имеем DataSet , в котором содержится результат какого-либо запроса. Для того чтобы этот результат получить мы должны обратится к нему кодом, вида DataTable . Rows [ index ][» ColumnName «] . Причем результат всегда имеет тип object . При обращении к нему мы должны использовать строковые и числовые «координаты». В другом же случае, таблица данных будет представлена в качестве объекта класса, где все столбцы таблицы будут определены как свойства класса, причем того же типа, в каком они определены в базе данных, а обращение примет вид DataTable . Rows [ index ]. ColumnName .

Для того, чтобы получать результаты в виде strongly-typed objects можно определить свой класс, в котором свойства будут отражать столбцы таблицы, а можно использовать Typed DataSet , который VS сделает сама.

В данной статье мы будем использовать Typed DataSet .

На следующем рисунке изображено взаимодействие между различными уровнями приложения при использовании Typed DataSet .

Рисунок SEQ Рисунок \* ARABIC 3. Весь код по выборке и обработке данных возложен на DAL

Создание Typed DataSet и DataTable Adapter

Для того, чтобы создать наш собственный Typed DataSet , необходимо добавить его к проекту. Для этого кликните правой кнопкой мыши в ветке проекта в Solution Explorer и выберите » Add New Item …», в списке шаблонов выберите DataSet , и назовите его Northwind . xsd

В открывшемся окне редактора щелкните правой кнопкой мыши в любом пустом месте и выберите Add / TableAdapter . Откроется мастер создания TableAdapter .

Здесь я опустил описание, что такое TableAdapter . Смотрите оригинал статьи или используйте поиск.

Перво-наперво вас попросят указать используемое подключение. Выберите NORTHWIN . MDF , если у вас его еще нет, тогда нажмите New Connection и создайте его.

Теперь необходимо определить каким образом данные будут браться из базы и определить первый запрос на выборку данных. Укажите Use SQL statements

Теперь необходимо ввести сам запрос. Его можно ввести вручную или использовать утилиту Query Builder . Введем запрос на выборку всех товаров из таблицы Products :

В Query Builder «е это будет выглядеть так:

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

И, напоследок, мастер предложит нам выбрать какие методы надо создавать и предложит ввести названия этих методов.

Таким образом мы создали TableAdapter для таблицы Products . Реализовали два метода: Fill (), который позволит заполнить DataTable , переданную в качестве параметра, и метод GetProducts (), который вернет DataTable () после выполнения. А на экране мы увидим следующее:

На данном этапе мы уже можем обратиться к объекту ProductTableAdapter , например таким кодом:

NorthwindTableAdapters.ProductsTableAdapter productsAdapter = new NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products; products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow productRow in products) Response.Write(«Product: » + productRow.ProductName + «
«);

Как вы видите, в данном коде мы не написали не бита для обращения к базе данных, мы обращаемся толька к объекту DataTable , который нам любезно возвращает функция GetProducts (); причем мы эту DataTable можем использовать в качестве DataSource для, скажем, выпадающего списка.

Ну вот и пришла пора привести конкретный пример! Для этого создадим страницу ASP . NET и назовем её AllProducts . aspx

ASP NET.MVC Урок 3. Работа с БД

Цель урока: Изучить основные принципы работы с базой данных. Краткое описание реляционной модели баз данных. Работа с базой данных (создание таблиц, связей в VS 2012). Команды INSERT, UPDATE, DELETE, SELECT. Использование LinqToSql и Linq. Создание репозитария, IRepository, SqlRepository.

Что такое БД
Таблицы

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

  • у таблицы есть имя (уникальное)
  • нет двух одинаковых строк
  • столбцы имеют разные наименования (нет двух одинаковых столбцов)
  • порядок строк в таблице произвольный (т.е. не надо учитывать порядок строк, если не задана сортировка)

Структуру таблицы можно записать в таком виде:

  • Имя столбца
  • Тип данных для этого столбца
Связи

Между таблицами существуют связи (relation). Для установки связи необходимо иметь следующее:

  • Первичный ключ – это набор столбцов (атрибутов) таблицы, однозначно определяющих уникальность строки. Обычно это одно поле, называется ID. Оно является автоикрементным, т.е. при попытке добавления записи, там автоматически вставляется 1, 2, 3, 4… n+1, где n – это значение последнего добавленного ID.
  • Внешний ключ – это набор столбцов (атрибутов) таблицы, которые однозначно определяют уникальность строки в другой таблице. Опять же это обычно одно поле, названное [Имя таблицы]ID. Но не является автоинкрементным.
  • Прописана связь между первичным ключом и внешним ключом.

Связи бывают трех типов:

  • Один-к-одному. Т.е. одной строке в таблице соответствует одна строка в другой таблице. Это редко используется, но используется. Например, в одной таблице данные о пользователе, а в другой — дополнительные данные о том же пользователе. Такой вариант необходим, чтобы манипулировать, по необходимости, меньшим количеством данных.
  • Один-ко-многим. Одной строк в таблице A соответствует одна или несколько строк в таблице B. Но одной строке в таблице B соответствует только одна строка в таблице A. В этом случае в таблице B существует внешний ключ, который однозначно определяет запись в таблице A.
  • Многие-ко-многим. Одной строке в таблице А соответствует одна или несколько строк в таблице В, что истинно и в обратном. В данном случае создается дополнительная таблица со своим первичным ключом, и двумя внешними ключами к таблице A и B.

Сейчас разберемся, как это делать.

Создание простой схемы в БД


Создадим БД в VS 2012:

Назовем её LessonProject, и добавим 3 таблицы Role User и UserRole.
Создадим таблицу Role:

Для строковых значений используем тип nvarchar(n), где n – максимальная длина строки, обычно используется от 50 до 500. Для больших текстовых строк используется nvarchar(MAX).

Устанавливаем первичный ключ:

Задаем для ID автоинкремент:

Подобным образом создаем таблицу User:

Поле Тип поля
ID int
Email nvarchar(150)
Password nvarchar(50)
AddedDate datetime
ActivatedDate datetime (null)
ActivatedLink nvarchar(50)
LastVisitDate datetime (null)
AvatarPath nvarchar(150) (null)

Создаем таблицу UserRole:

Поле Тип поля
ID int
UserID int
RoleID int

Добавляем новую связь, нажав Add. Добавление связей происходит в таблице, где находятся внешние ключи. Раскрываем вкладку Tables and Columns и выставляем таблицу с первичным ключом, и выбираем внешний ключ в текущей таблице UserRole.

В свойствах INSERT And UPDATE Specification выставляем On Update/On Delete свойства Cascade:

Это необходимо для того, чтобы при изменении/удалении столбца из таблицы Role все связанные с этой строкой строки таблицы UserRole должны быть изменены или удалены.

Аналогичную связь мы устанавливаем с таблицей User.

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

SELECT, INSERT, UPDATE, DELETE.

В реляционных базах данных используется язык запросов SQL.

Есть 4 основные команды для манипулирования данными — SELECT, INSERT, UPDATE, DELETE

SELECT – для выбора данных и таблиц.
Пример:

INSERT — Добавление строк в таблицу
Пример:

UPDATE – изменение значений в таблице
Пример:

DELETE – удаление строк из таблицы
Пример:

LinqToSQL и Linq.

Создадим проект LessonProject.Model для работы с БД типа ClassLibrary.
Добавляем LINQ to SQL Classes тип, называем LessonProejctDb.dbml

Открываем объект, выделяем все таблицы и мышкой переносим на холст:

Собственно, с помощью таких простых действий мы получаем:

  • классы, готовые к использованию в работе с БД
  • визуальное отображение таблиц и связей

Добавим несколько данных в таблицу Role и User:

1 admin Админ
2 customer Заказчик
1 chernikov@gmail.com 123456 1/1/2012 12:00:00 AM NULL 123456 NULL NULL
2 chernikov2@gmail.com 123456 1/1/2012 12:00:00 AM NULL 123456 NULL NULL
ID UserID RoleID
1 1 1
2 1 2
3 2 2

Создадим консольный проект Lesson3 и подключим LessonProject.Model. Добавим сборку System.Configuration и System.Data.Linq. Проинициализируем context и выведем данные о ролях:

Для добавления строки в Role делаем так:

Для удаления строки в Role делаем так:

Для изменения данных делаем так:

Для манипуляции данных используется язык запросов Linq. Мы рассмотрим только некоторые основные функции Linq. Linq применяется для типов реализующий интерфейс IQueryable<>

    .Where() – основная функция фильтрации. Возвращает тип IQueryable. Условие внутри должно возвращать булево значение (bool).

  • .FirstOrDefault() — .First(), .Single(), .SingleOrDefault() – получают первую или единственную запись. Если записи нет, то FirstOrDefault() или SingleOrDefault() возвращают null (на самом деле, значение по умолчанию этого типа [default(int)], например).
    – получаем первую (или не получаем) роль названную «Менеджер».
  • .Take() – выбирает N первых записей
    – выберет 4 первые записи
  • .Skip() – пропускает выбор N первых записей
    – пропустит первые 2 и выберет 3 следующие записи
  • .OrderBy() – сортирует по возрастанию. А также OrderByDescending(), ThenBy(), ThenByDescending(). Лямбда-выражение должно возвращать тип int, по которому и будет происходить сортировка.
    – сортирует по порядку
  • .Count() – получает количество записей
    – количество записей
  • .Any() – существует одна или больше записей по данному условию
    var rolesExist = context.Roles.Where(p => p.Name == «Менеджер»).Any() – есть ли запись такая
  • . Select() – возвращает IQueryable произвольного типа, может быть даже dynamic:
    – получаем динамический тип, сформированный на основе Role.
  • .SelectMany() – возвращает объединение всех IQueryable типов внутри выборки:
    – получаем все UserRole из роли, названной «Менеджер»
  • .Distinct() – удаляет дубликаты
    – все пользователи с ролью названной «Менеджер»
  • Примечание: First(), FirstOrDefault(), Single(), SingleOrDefault(), Any(), Count() – могут применять параметр, соответствующий Where() , тем самым, можно сокращать запись:

    Создание репозитория IRepository, SqlRepository.

    Собственно с БД мы уже можем работать, только теперь нужно отделить модель данных от конкретной реализации, т.е. наши контроллеры про context и System.Data.Linq вообще не должны ничего знать.

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

    Реализацию назовем SqlRepository. Так как мы с данным контекстом SqlRepository не хотим особо связывать, то добавим Ninject модуль в проект LessonProject.Model:

    Создадим класс SqlRepository:

    Прежде, чем реализовать доступ ко всем таблицам, создание, удаление и изменение, подумаем о том, что файл этот будет выглядеть громадным и неуклюжим. Таким кодом будет управлять тяжело физически. Так что сделаем отдельную папку SqlRepository и SqlRepository класс сделаем partial, а в папке создадим реализации интерфейса IRepository, разбитые по каждой таблице. Назовем файл Role:

    Небольшой проект содержит от 10 до 40 таблиц, большой проект от 40, и всё это хотелось бы как-то автоматизировать. Создадим несколько сниппетов, для IRepository и для SqlRepository. Сниппеты – это уже готовые шаблоны кода, которые вызываются с помощью intelliSence, и позволяют быстро создавать код.

    Сниппеты

    Для IRepository таблиц, создадим table.snippet:

    Для SqlRepository создадим сниппет sqlTable.snippet:

    Для того, чтобы добавить code-snippet. откроем TOOLS -> Code Snippet Manager… (Ctrl-K, B). В окне нажимаем Import и импортируем оба сниппета в My Code snippet:

    Finish, OK.
    Используем для таблиц User и UserRole.

    Осталось прописать только поля для Update [имя таблицы], но это уже меньше работы.

    Proxy

    Как видим, классы, которые мы используем, являются partial, поэтому их можно дополнить. Создадим, подобно SqlRepository, папку Proxy, где будем размещать partial классы. Например, для класса User создадим метод, который автоматически генерирует строку, требуемую для активации пользователя:

    Использование БД в asp.net mvc

    Добавим строку доступа к БД в web.Config:

    Проинициализируем работу с БД в Ninject:

    Применяем InRequestScope(). Т.е. каждый запрос будет использовать отдельный объект SqlRepository. Это позволит избежать коллизий при исполнении.Объявляем IRepository в контроллере:

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

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

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


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

    . Часть 1

    Интерфейс к базе данных с помощью ASP

    Постановка задачи

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

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

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

    Что нам понадобится

    Для реализации вышеизложенной задачи нам потребуется персональный компьютер с Microsoft Windows NT или Windows 2000 (можно и Workstation, и Server), установленный IIS (Internet Information Server), какой-нибудь HTML-редактор (советую использовать Macromedia Dreamweaver), Microsoft Access (версии 95, 97 или 2000) и самый обычный текстовый редактор.

    Создание и подготовка базы данных

    Прежде всего создадим базу данных статей, для чего:

    • запустим приложение Microsoft Access;
    • любым из известных способов создадим новую базу данных. Назовем ее «Articles»;
    • в созданной базе данных создадим таблицу с именем, например «Articles»;
    • пользуясь инструментом «Конструктор», определим поля нашей таблицы и типы принимаемых ими значений (рис. 1);
    • заполним таблицу несколькими статьями в соответствии с созданными полями (рис. 2);
    • сохраним базу данных в файле «ArticlesDB.mdb».

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

    • запустим программу-конфигуратор источников данных (Data Sources ODBC) — Start->Settings->Control Panel->Administrative Tools->Data Sources ODBC;
    • перейдем во вкладку «System DSN» и создадим новый источник данных, нажав на «Add…»;
    • в появившемся списке драйверов выберем драйвер баз данных Microsoft Access — «Microsoft Access Driver (*.mdb)» и нажмем на «Finish»;
    • в строке «Data Source Name» зададим имя нашей базы данных, например «Articles» (это то имя, по которому мы в дальнейшем будем обращаться к ней);
    • нажмем на «Select…», выберем подготовленный нами файл «ArticlesDB.mdb» и нажмем «OK».

    В результате в списке источников данных в вашей системе появится строка, представленная на рис. 3.

    Оформляем главную страницу (index.asp)

    С ASP работать очень просто. Для этого надо всего лишь вставить текст скрипта ASP в пару тэгов . В остальном ASP-файл ничем не отличается от HTML-файла (за исключением, пожалуй, расширения). Комментарии в HTML, как известно, вставляются в пару тэгов , в ASP же закомментировать строку можно при помощи символа ‘ (апостроф) в ее начале.

    Теперь давайте разберемся. Во-первых, как вы наверняка заметили, ASP-код легко сочетается с HTML-тэгами; в этом его достоинство. Так, к примеру, строка Response.Write Link & «
    » отображает на экране браузера клиента подготовленное сервером значение переменной Link и HTML-тэг
    , то есть перевод строки. Особый интерес вызывает переменная rs. Для искушенных программистов сразу скажу — это указатель. Однако в ASP с целью облегчения работы начинающих указатели маскируются. Здесь не встретишь громоздких С’шных конструкций, типа «я знаю, что ты знаешь, что я знаю», или, выражаясь программистским языком, указатель на указатель… Однако сделано это так искусно, что гибкость программирования при этом не теряется, нет лишь прямой работы с указателями, а только работа с помощью специальных функций, скрывающих от программиста рутину и защищающих указатели от некорректных действий. Таким образом, выражение rs.Fields («Article»).value означает значение поля «Article» текущего значения указателя на элемент базы данных (в нашем случае статей) и содержит текст статьи, которая соответствует текущей позиции указателя на все статьи. Переход к следующему элементу базы (смещение указателя) выполняется с помощью инструкции Rs.MoveNext. В приведенном выше примере это не делается, а попросту формируется ссылка на текст статьи в виде ее названия и отображается комментарий самой первой статьи, соответствующей результату запроса. Давайте попробуем отобразить все статьи нашей базы данных на главной странице в виде HTML. И еще, обратите особое внимание на директиву:

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

    Первая строчка скрипта шаблона HTML присваивает переменной TheID значение, переданное ссылкой с использованием метода Request.QueryString. Далее открывается база данных, из которой читается статья (запись), соответствующая идентификатору, переданному из главного скрипта (index.asp).

    Создаем главную страницу

    Таким образом в таблицу в цикле будут добавляться ряды со ссылками на статьи и с аннотациями, пока не будут отображены все статьи из базы данных. Следует обратить внимание на переменную Cnt. По окончании цикла она будет содержать число обработанных статей (рядов таблицы).

    Язык структурированных запросов — SQL

    Настала пора разобраться с тем, что таится за строчками:

    По сути, именно за этими двумя строчками кроется работа с нашей базой данных: первая представляет собой текстовую строку с запросом к базе данных (текстовые строки в ASP записываются в двойных кавычках); вторая — содержит директиву выполнения этого запроса с одновременным присвоением результата переменной (указателю на записи в базе данных). В рамках настоящей статьи мы не будем рассматривать SQL (Structured Query Language) во всех деталях, а остановимся лишь на тех его операторах, без понимания которых дальнейшая работа будет невозможна. Для тех, кому этого покажется недостаточным, советую посетить отобранные мною сайты с детальной документацией по SQL.

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

    DELETE удаляет те ряды из «Имя Таблицы», которые удовлетворяют условию, определенному в «Определении», и возвращает число удаленных рядов. Если выполнить команду DELETE без условия WHERE, то все ряды указанной таблицы будут удалены. В этом случае DELETE возвратит 0. Ключевое слово LOW_PRIORITY откладывает выполнение операции DELETE до завершения работы чтения из таблицы других клиентов.

    SELECT используется для извлечения рядов (записей) из одной или более таблиц. Выражение_Select определяет столбцы таблицы, значения которых необходимо извлечь. Все ключевые поля должны быть заданы в строгой последовательности. К примеру, выражение HAVING должно следовать за любым выражением GROUP BY и до любого выражения ORDER BY.

    Выражение_Select можно заменить псевдонимом (alias) с помощью ключевого слова AS. Псевдоним используется в качестве идентификатора имени столбца и может быть использован наряду с ключевыми словами ORDER BY или HAVING.

    Выражение HAVING может относиться к любому столбцу или псевдониму в Выражении_Select. Оно применяется к запросу в последнюю очередь, непосредственно перед посылкой данных клиенту. SELECT . INTO OUTFILE ‘имя_файла’ заносит отобранные записи в файл. Файл создается непосредственно на сервере и не может «уже существовать» (одна из основных причин такого механизма заключается в предотвращении случайного «затирания» различных важных файлов).

    INSERT используется для добавления новых записей в существующую таблицу. Допустимо две формы использования INSERT.

    Первая форма — INSERT . VALUES — вставляет ряды на основании заданных значений. Вторая форма — INSERT . SELECT — вставляет ряды, выбранные из другой таблицы.

    Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Ключевое слово IGNORE в команде INSERT позволяет избегать вставки повторяющихся строк (используется в сочетании с ключевыми словами PRIMARY или UNIQUE). Для второй формы INSERT INTO . SELECT операция не может содержать выражения ORDER BY. Таблица, в которую производится добавление записей, не может присутствовать в выражении FROM части SELECT запроса потому, что запрещено производить выделение из той же самой таблицы, в которую производится вставка.

    REPLACE служит для редактирования содержимого таблицы и работает в точности как INSERT, за исключением того, что если старая запись в таблице имеет то же значение, что и записываемая, то старая запись удаляется прежде, чем добавляется новая.

    UPDATE обновляет поля существующей таблицы новыми значениями. Выражение SET показывает, какие поля (столбцы) должны быть изменены, и значения, которые должны быть им присвоены. Выражение WHERE, если оно есть, указывает, какие ряды должны быть обновлены. В противном случае операция применяется ко всем рядам таблицы. Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Выражения UPDATE выполняются слева направо.

    Обновляет значение поля Password в таблице WAPassword, записывая в поле, чей идентификатор ID равен 1 значение ‘passw’.

    Увеличивает значение поля counter таблицы Счетчик на 1.

    Удваивает поле age, а затем прибавляет 1 к его значению в таблице persondata.

    Что такое Global.asa

    Global.asa позволяет выполнять определенные скрипты в начале работы клиентской сессии или при инициализации IIS. Примером тому может служить простейший счетчик числа посещений сайта. Более того, допустимо использовать множественные файлы Global.asa. Однако следует помнить, что ASP-скрипт ищет самый близкий (расположенный в том же каталоге) файл Global.asa и использует именно его.

    По сути, этот файл может содержать четыре скрипта: первый будет выполняться при инициализации службы IIS/PWS (Application_OnStart), второй — при остановке службы IIS/PWS (Application_OnEnd) (обычно эти первые два скрипта отрабатывают в процессе перезагрузки компьютера), и еще два скрипта выполняются дополнительно при инициализации сессии пользователя (Session_OnStart) и по ее окончании (Session_OnEnd). Данная схема очень сильно напоминает пары «конструктор-деструктор». Неспроста всякая переменная, которая должна быть использована (например, в текущей сессии), может быть инициализирована в Session_OnStart с тем, чтобы быть использованной в процессе работы сессии, она же уничтожается (обнуляется) в Session_OnEnd.

    Global.asa не может содержать тэгов HTML. Недопустимо использование JavaScript. Не рекомендуется писать файл Global.asa с помощью каких-либо HTML-редакторов, для этого гораздо лучше использовать NotePad. И еще один совет: прежде чем вставлять скрипт в файл Global.asa, попробуйте его в работе в обычном ASP-файле.

    Пример файла Global.asa

    Добавляем новую статью (UploadForm.asp и Upload2DBS.asp)

    Теперь, когда мы разобрались с SQL, можно приступать к добавлению новой статьи, причем делать мы это будем прямо с сайта, а если быть точнее — непосредственно с HTML-формы. Для этого сначала создадим файл с самой формой и определим скрипт-реакцию на подтверждение (кнопку «Publish the article!»). (Предполагается, что читатель знаком с азами построения HTML-форм, поэтому мы рассмотрим этот процесс, не вдаваясь в детали построения форм.)

    Прежде всего следует уточнить задачу на этом этапе. Итак, очевидно следующее:

    • на загрузку статьи с сайта должен иметь право не каждый (следовательно, желательно предусмотреть пароль для доступа к этой функции);
    • у каждой статьи есть определенная тема (рубрика), причем она не может быть произвольной, а должна выбираться из списка;
    • список можно хранить непосредственно в HTML-файле и, каждый раз изменяя его, изменять сам файл. Это самый простой и быстрый способ;
    • однако для того, чтобы позволить динамически изменять и пополнять этот список, рекомендуется держать его в базе данных. Это позволит пользователям произвольным образом изменять его содержимое и не потребует переделки формы. Для простоты сначала рассмотрим вариант со встроенным («жестко прошитым») рубрикатором.

    Как видим, передача управления осуществляется благодаря директиве ACTION=»http://localhost/Upload2DBS.asp»> в тэге формы. Тем самым указывается скрипт-ответ на реакцию пользователя после нажатия на кнопку «Publish the article!». Теперь остановимся на селекторе рубрик. Как уже отмечалось, желательно перевести его содержимое в базу данных. Для этого в нашей базе данных (файл ArticlesDB.mdb) создадим новую таблицу с именем, к примеру «Topics», в которой с помощью конструктора определим всего одно поле — «Topic» типа «текст». Далее заполним эту таблицу произвольными значениями нашего рубрикатора и отсортируем полученный список в алфавитном порядке. После чего следует заменить тэг

    Теперь давайте разберемся с самой сутью дальнейшей работы. Что же должен делать наш скрипт-реакция?

    Во-первых, следует позаботиться о том, чтобы все обязательные поля (а они отмечены звездочкой) были введены. Наиболее правильным способом проверки этого является скрипт, написанный на любом языке описания скриптов (например, JavaScript), который будет проверять, введены ли значения обязательных полей. Для этого достаточно добавить в определение тэга формы параметр onsubmit=»preprocess();», где preprocess() — имя функции-скрипта, который и будет осуществлять проверку. Здесь как нельзя кстати видно преимущество языков описания сценариев (JavaScript, Jscript, VBScript) перед ASP. ASP выполняется на стороне сервера, а перегружать связь «клиент-сервер» простой проверкой типа «введены ли значения», согласитесь, неправильно. Однако специально в целях обучения мы будем делать это с помощью ASP.

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

    Удаляем статью (RemoveForm.asp и Rem.asp)

    Было бы неплохо предусмотреть возможность удаления статьи с нашего сайта: во-первых, она может устареть, а во-вторых, в процессе ее подготовки не исключены ошибки или опечатки. Останавливаться на форме удаления статьи не будем, скажем лишь, что она содержит единственные элементы с запросом пароля и кнопкой удаления (см. файл RemoveForm.asp), и сразу перейдем к рассмотрению непосредственно процесса удаления:

    Особое внимание следует уделить первым двум строкам. Они получают значение глобальной переменной текущего сеанса (сессии) работы со значением идентификатора текущей статьи (в нашем случае удаляемой), которая была инициализирована (файл ArtTmp.htm) следующей строкой:

    Таким образом, в текущий скрипт передается в качестве параметра сеансовая переменная с идентификатором текущей статьи, которую необходимо удалить. Имеется в виду, что ссылка на удаление присутствует в странице с шаблоном (файл ArtTmp.htm) и удаляемая статья является текущей.

    Организуем поиск (SearchForm.asp и SearchDBS.asp)

    Как известно, без поиска навигация в сколь-нибудь солидной базе данных невозможна в принципе. Попробуем организовать поиск статьи по ее реквизитам, причем постараемся организовать булев (логический) поиск, соединяя отдельные значения критериев поиска с помощью логики «И/ИЛИ».

    Опять же не заостряя внимание на поисковой форме (файл SearchForm.asp), перейдем непосредственно к самому процессу поиска:

    Самое интересное происходит при формировании запроса к базе из составляющих:

    В зависимости от введенной пользователем комбинации исходных полей из этих компонентов формируется окончательный запрос, в частности для полей «Author» и «Title». Возможны четыре случая: оба поля пусты, пусто первое поле, пусто второе поле и оба поля не пусты. Соответствующая строка SQL-запроса в каждом из этих случаев формируется по-своему. То же самое относится к состоянию селекторов рубрик статей и порядку их сортировки. При добавлении той или иной подстроки учитывается состояние «радиокнопок» И/ИЛИ и соответствующая подстрока добавляется в SQL-запрос, предваряясь логическим элементом «and» или «or» соответственно. После того как окончательный запрос сформирован, он выполняется, а результирующая страница формируется исходя из списка статей, удовлетворяющих критериям.

    Полный код приведенных в статье примеров, включая файл базы данных, находится на нашем CD-ROM.

    И в заключение

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

    Среди множества инструментальных средств, служащих для облегчения создания ASP-приложений, выделяются два: Easy ASP © Eric Banker, 2000 и Microsoft InterDev из комплекта Microsoft Visual Studio 6.0. Первый — очень удобное, несложное и небольшое средство для быстрого создания ASP-приложений. Второй представляет собой мощный, тяжеловесный интегрированный пакет в духе Microsoft для разработки всевозможных Web-приложений.


    Временная версия EasyASP 4.0 находится на нашем CD-ROM.

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

    http://www.15seconds.com/issue/000210.htm — создание динамичных JavaScript-скриптов с помощью ASP и интерфейсов к базам данных

    http://www.alphasierrapapa.com/iisdev/ — сайт, посвященный разработке серверов IIS с помощью ASP

    http://www.websiteresources.com/ — огромная база исходных текстов всевозможных Web-программ

    Примеры ASP-кода для профессионалов

    http://www.asptoday.com/search.asp?category=ASP Tricks — масса полезных советов для начинающих программировать на ASP

    http://www.oreilly.com/catalog/aspnut/ — замечательная книга популярнейшей серии «In a Nutshell» всемирно известного издательства O’REILLY «ASP in a Nutshell A Desktop Quick Reference». На сайте бесплатно размещена одна из глав книги

    http://www.chilisoft.net/ — версии ASP для различных платформ можно скачать с этого сайта

    http://www.willcam.com/sql/ — введение в структурированный язык запросов SQL

    SQL Reference and Example Site — хорошо структурированный материал по SQL

    Доступ к данным с NHibernate

    Данная глава охватывает следующие темы:

    • Разъединение механизмов доступа к данным из ядра и из пользовательского интерфейса
    • Настройка NHibernate преобразований
    • Начальная загрузка NHibernate
    • Вызов механизма доступа к данным из ASP.NET MVC

    Даже если ASP.NET MVC Framework фокусируется на уровне представления, многие разработчики работают с небольшими приложениями, для которых не нужны несколько уровней бизнес-логики, а также не требуется разделение между уровнем представления и хранением данных. Некоторые из этих образцов имеют только небольшое количество простых экранов, которые хранят и извлекают данные из небольших баз данных. Для таких приложений могут подходить простые шаблоны разделения, но многие небольшие приложения со временем становятся все больше по сравнению с тем, какими они были определены первоначально. Когда такое случается, концепция разделения является крайне необходимой для долгосрочной поддержки программного обеспечения в рабочем состоянии.

    Для того чтобы достичь концепции разделения при взаимодействии с реляционной базой данных, вы можете воспользоваться таким инструментом объектно-реляционного преобразования (ORM), как популярный NHibernate проект с открытым исходным кодом. Вы видели, что в рамках NuGet вы можете использовать множество библиотек и фреймворков, которые создаются разработчиками по всему миру. NHibernate – это одна из библиотек, доступных посредсвом NuGet. Эта библиотека делает тривиальным процесс доступ к данным в рамках реляционных баз данных.

    Hello, ASP World!

    Вы можете увидеть этот текст, выбрав строку Source из меню View в главном окне браузера. Обратите внимание, что в документе нет последовательностей символов « » и « %> ». Все конструкции, содержащие такие последовательности, интерпретируются сервером. Они никогда не попадают в создаваемый документ HTML.

    Рис. 3-2. Просмотр страницы HelloASP.asp в окне браузера

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

    Исходный текст страницы ASP, создающей таблицу, приведен в листинге 3-2.

    Листинг 3-2. Файл ch03/ForASP.asp

    Первая строка файла страницы ForASP.asp содержит оператор @LANGUAGE , определяющий язык серверного сценария:

    Заголовок таблицы оформлен как обычно при помощи стандартных тегов языка HTML. Что же касается строк со значениями, то они формируются серверным сценарием в цикле:


    Значение X Значение X*X

    Счетчиком цикла служит переменная i , принимающая значения от 0 до 5. При помощи конструкции мы вставляем в ячейки каждой строки текущее значение переменной i , а с помощью конструкции — значение квадрата этой переменной.

    Ниже мы приводим исходный текст документа HTML, создаваемого при помощи страницы ForASP.asp. Как видите, получившийся документ HTML не содержит никаких строк сценариев:

    Таблица квадратов целых чисел от 0 до 5











    Значение X Значение X*X
    1 1
    2 4
    3 9
    4 16
    5 25

    Внешний вид получившейся таблицы после загрузки документа в окно браузера показан на рис. 3-3.

    Рис. 3-3. Просмотр страницы ForASP.asp в окне браузера

    Наше следующее приложение Web запрашивает у пользователя регистрационную информацию, а затем показывает ее пользователю в окне браузера. Цель данного примера — показать, как с помощью серверных сценариев в страницах ASP можно получить доступ к данным, введенным при помощи форм.

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

    Рис. 3-4. Форма для запроса идентификатора и пароля пользователя

    В нашем простом примере никакого подключения не происходит. Вместо этого сервер Web создает и отправляет пользователю страницу HTML с регистрационной информацией (рис. 3-5).

    Рис. 3-5. Просмотр регистрационной информации

    Форма находится в обычном документе HTML (листинг 3-3) и не имеет никаких особенностей. В частности, здесь мы не применяем клиентских сценариев для проверки правильности введенных данных.

    Листинг 3-3. Файл ch03/LoginForm.html

    В качестве значения параметра ACTION тега

    Во-вторых, к тегу мы добавили параметр NAME , определяющий имя формы как RegForm . Это имя потребуется нам для ссылки на поля формы в клиентском сценарии.

    И наконец, в-третьих, теперь в параметре ACTION указано имя другой страницы ASP.

    Функция checkForm выполняет простейшую проверку — указал ли пользователь идентификатор и пароль. Если что-то пропущено, на экране пользователя появляется сообщение об ошибке. Если же пользователь все данные ввел правильно, функция checkForm отправляет их на сервер при помощи метода document.RegForm.submit .

    Эта незамысловатая операция уменьшает количество обращений на сервер Web, отсекая пользователей, не указавших свои пароли или имена.

    Страница ASP, получает управление, когда пользователь щелкнет кнопку Подключиться. Она содержит как серверный, так и клиентский сценарий (листинг 3-6).

    Листинг 3-6. Файл ch03/LoginCheckEx.asp

    Задача серверного сценария, строки которого выделены символами « » и « %> », — извлечение идентификатора пользователя и пароля из данных формы с целью отображения в окне браузера (как и в предыдущем примере):

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



    Идентификатор:
    Пароль:

    Что же касается клиентского сценария, то он состоит из одной функции goBack :

    Эта функция получает управление после щелчка пользователем кнопки Назад, добавленной в таблицу (рис. 3-6). Она загружает в окно браузера документ с формой регистрации, расположенной в файле LoginFormEx.html.

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

    Рис. 3-6. Кнопка Назад предназначена для возврата к форме регистрации

    До сих пор при создании простейших приложений Web средствами ASP мы допускали некоторые упрощения. Теперь настало время определить такое понятие, как приложение ASP.

    Фактически это подмножество приложений Web, созданных с использованием технологии активных серверных страниц ASP и сервера Microsoft Internet Information Server.

    Приложение ASP должно располагаться в отдельном виртуальном каталоге сервера Web или занимать корневой каталог виртуального сервера Web. В этом каталоге необходимо разместить:

    · документ HTML или страницу ASP, которая загружается по умолчанию, когда посетитель указывает адрес URL данного каталога в своем браузере;

    · специальный текстовый файл с именем global.asa, определяющий обработчики событий, возникающих в процессе работы приложения ASP;

    · каталоги, содержащие обычные документы HTML, активные страницы ASP, графические изображения, элементы управления ActiveX, аплеты Java и другие объекты, имеющие отношение к приложению.

    Что касается документа HTML или страницы ASP, загружаемой по умолчанию при доступе к каталогу приложения ASP, то его имя определяется при настройке параметров сервера Web. По умолчанию сервер Microsoft Internet Information Server использует для этой цели имя default.htm, однако Вы можете изменить его на более привычное index.html или любое другое.

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

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

    Как мы только что сказали, файл global.asa имеет отношение к приложению ASP в целом и создается для каждого такого приложения. Он должен находится в корне виртуального каталога приложения ASP или в корне виртуального сервера Web.

    В этом файле определены обработчики следующих событий:

    · запуск приложения ASP;

    · останов приложения ASP;

    · начало сеанса пользователя, загрузившего в свой браузер главную страницу приложения ASP;

    · завершение сеанса пользователя с приложением ASP.

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