Классы Command и DataReader
позволяет выполнить SQL-оператор любого типа. Хотя класс Command можно использовать для решения задач определения данных (таких как создание и изменение баз данных, таблиц и индексов), все же более вероятно его применение для выполнения задач манипулирования данными (вроде извлечения и обновления записей в таблице).
Специфичные для поставщика классы Command реализуют стандартную функциональность, в точности как классы Connection. В данном случае небольшой набор ключевых свойств и методов, используемых для выполнения команд через открытое соединение, определяется интерфейсом IDbCommand.
Основные сведения о командах
Прежде чем использовать команду, необходимо выбрать ее тип, установить ее текст и привязать к соединению. Всю эту работу можно выполнить, установив значения соответствующих свойств (CommandType, CommandText и Connection), либо передать необходимую информацию в аргументах конструктора.
Текстом команды может быть SQL-оператор, хранимая процедура либо имя таблицы. Это зависит от типа используемой команды. Существуют три типа команд, которые описаны в таблице:
Значение | Описание | |||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CommandType.Text | ||||||||||||||||||||||||||||||||||||||||||||||||
CommandType.StoredProcedure | ||||||||||||||||||||||||||||||||||||||||||||||||
CommandType.TableDirect |
Метод | Описание | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ExecuteNonQuery() | |||||||||||||||||||||||||||||||||||||||||||
ExecuteScalar() | |||||||||||||||||||||||||||||||||||||||||||
ExecuteReader() |
Метод | Описание | |||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Read() | ||||||||||||||||||||||||||||||||||||||
GetInt32(), GetChar(), GetDateTime(), Get. () | ||||||||||||||||||||||||||||||||||||||
NextResult() |
Команды:
Чтобы получить больше информации о команде, запустите из командной строки user-secret [command] —help . SqlConfig¶Пакет Microsoft.Framework.Caching.SqlConfig содержит команды для создания таблицы и индексов в БД Microsoft SQL Server, чтобы они были использованы для дистрибутивного кэширования ASP.NET 5. Сборка: Microsoft.Framework.Caching Использование: sqlservercache [options] [command]
Команды:
Чтобы получить больше информации, используйте из командной строки user-secret [command] —help . Об объектах команды ASPОбъект команды может многократно использоваться в том смысле, что сервер приложений может многократно использовать простую откомпилированную версию объекта для выполнения команды несколько раз. Сделать команду многократно используемой можно с помощью задания свойству «Подготовленный» объекта «Команда» значения true , как это показано в следующем предложении VBScript. Если известно, что команда будет выполняться несколько раз, наличие простой откомпилированной версии объекта может увеличить эффективность операций с базой данных. Объект команды создается сценариями на ASP-странице, но Dreamweaver позволяет создавать объекты команды без написания ASP-кода. Создание страниц ASP.NET в среде Visual StudioСреда Visual Studio существенно облегчает разработку Web-приложений. Основными действиями, выполняемыми в ходе создания приложения в среде, являются создание форм, написание обработчиков событий, добавление файлов (таблиц стилей, страниц и т.п.), отладка В Visual Studio разных версий предлагается несколько режимов создания Web-приложений, функционирующих на основе ASP.NET, чаще всего используются Website… и Project… В Visual Studio 2005 включен только Website…, в 2008 и 2010 – оба. В режиме создания Web-сайта (File — New – Website…). Visual Studio создает только файлы, относящиеся к сайту (файл с кодом страницы, файл с программами обработчиков и файл конфигурации). В окне New Web Site могут быть дополнительно указаны параметры: версия .NET, шаблон (выбираем ASP.NET WEB Site), размещение (место хранения файлов Web-сайта), язык программирования. После того, как выбор сделан (нажата ОК) будет создана заготовка Web-приложения (три основных файла). Компиляция страниц будет выполняться средой ASP.NET перед открытием в браузере. В режиме создания проекта (File — New – Project…) кроме основных файлов, генерируется несколько вспомогательных и файл проекта с расширением .csproj, в котором фиксируются составляющие проект файлы и сохраняются некоторые отладочные параметры. В окне New Project кроме типа (ASP.NET Web Application), места размещения и языка, необходимо выбрать имя (Solution Name), которое затем будет использовано для создания в выбранном месте размещения соответствующего подкаталога. В отличие от режима создания Web Site, кроме размещения информации в различных файлах, при запуске Web-проекты компилируются Visual Studio (а не ASP.NET). Классы Web-страниц объединяются в одну сборку, которая получает то же имя, что и у Web-проекта (например, WebApplication) и затем размещается в папке bin. В Web-проекте для страниц всегда используют модель отделенного кода, объявления для всех элементов управления содержаться в файле с расширением .aspx.desginer.cs. Во время компиляции файлы с кодами обработчиков и кодами элементов управления будут объединены. В беспроектном Web-сайте файла с объявлениями элементов управления нет, поскольку эта часть кода генерируется во время компиляции системой ASP.NET. Есть и другие отличия (например, в содержании директивы Page и т.п.), останавливаться на которых мы не будем. Дальнейшие действия по созданию Web-приложения практически не отличаются. В ходе работы по созданию сайтов используются окна и панели, состав и место расположения которых можно изменять, используя меню View и перетаскивая их мышью. Типичный вид среды при разработке Web-приложений приведен на рис.4.4. Рис. 4.4. Вид окна для разработки Web-приложений Панели инструментов, содержат различные команды для форматирования текста, поиска текста и т.д. Обозреватель решений, отображает файлы и папки веб-узла. Окно документов обеспечивает отображение документов в различных представлениях и служит визуализированным редактором форм. Окно Свойств отображает параметры страницы, элементов HTML, элементов управления и других объектов, а также позволяет изменять их. Панель элементов содержит элементы управления и HTML-элементы, которые можно размещать на страницах. Обозреватель серверов (баз данных) отображает подключения различных служб компьютера, в том числе серверов баз данных. Окно вывода служит для вывода сообщений среды (ошибки, информация отладчика и т.п.). Создание форм. Создаваемые документы (формы и файлы с программным кодом) открываются в окне документов. При работе с формами предусмотрено два режима отображения Design и Source. В первом режиме интерфейс можно конструировать визуально, во втором – путем написания кода разметки. Для переключения используются закладки в нижней части окна. В режиме Design можно повысить наглядность отображаемой структуры, выполнив команду Details из меню View. Форма ASP.NET – документ, на основе которого формируется HTML-страница, отправляемая клиенту. Она создается путем размещения элементов в окне документов. Элементы для размещения выбираются из панели инструментов. В панели элементы сгруппированы по типам. Чаще всего используются элементы из групп HTML и Standard. Группа HTML содержит HTML-элементы, соответствующие одноименным элементам обычных Web-страниц. С их использование создается статическая разметка страницы. Однако они могут быть преобразованы в серверные путем добавления атрибута runat=»server» или выполнения команды Run As Server Control из контекстного меню элемента. Их называют серверными HTML-элементами управления, при их обработке перед отправкой формируется только один HTML-тег. Группа Standard содержит серверные элементы управления с расширенной функциональностью. Среди них имеются полнофункциональные элементы управления, выполняющие генерацию достаточно сложного HTML-кода и клиентских сценариев JavaScript для создания развитого интерфейса на клиенте. Это такие элементы как Calendar, AdRotator, TreeView. Среди них есть и аналоги HTML-элементов (кнопок, текстовых полей и т.д.). Элементы этой группы называют серверными Web-элементами управления, они являются основными при создании форм. Среди других групп отметим такие. Login — элементы управления входом в систему. Эти элементы управления поддерживают аутентификацию пользователя, их можно использовать вместо написания своих собственных интерфейсов для входа в систему и создания новых пользователей. Navigation — элементы управления навигацией. Они позволяют пользователю перемещаться с одной страницы на другую, отображают карту сайта и др. Validation — элементы управления проверкой правильности заполнения полей пользователем. Data — элементы управления данными. После размещения элемента имеется возможность задания его свойств с помощью окна свойств. Элемент необходимо выделить, в окне отобразятся его свойства, которые можно изменять. Написание обработчиков событий. При написании обработчиков окно документа переключается в режим кода. Для переключения можно открыть файл с кодом, выбрав его в обозревателе решений, или выполнить двойной щелчок на элементе, для которого пишется обработчик. Последующие действия не отличаются от тех, что выполнялись при разработке оконных приложений. В обработчиках можно задать реакцию на действия пользователя, изменять свойства элементов, динамически создавать элементы. Создадим страницу для ввода анкеты с данными пользователя при первом обращении, и выводом сообщения о состоявшейся регистрации при последующих обращениях. Часть элементов для ввода данных создадим динамически. . Часть 1Интерфейс к базе данных с помощью ASPПостановка задачиПредположим, перед нами стоит задача создания газетного сайта, причем некоторые из его читателей должны иметь право пополнять его новыми статьями, снабжаемыми фотографиями непосредственно с самого сайта и без программирования. Предположим также, что такой сайт должен иметь возможности удаления статей, их поиска, а также сортировки. С первого взгляда может показаться, что решение такой задачи не под силу начинающему программисту ASP, однако, как вы скоро увидите, это далеко не так. Для начала давайте все-таки разберемся, что же от нас требуется. По сути, необходимо создать базу данных всех статей, подготовить несколько HTML-форм для загрузки статей на сервер, их поиска, сортировки, удаления и, наконец, отображения результата. Я почти уверен, что подобная задача актуальна применительно практически к любому сайту, тем более что подобным образом (разве что без возможностей поиска, сортировки и удаления) работает большинство гостевых книг (guestbook). Что нам понадобитсяДля реализации вышеизложенной задачи нам потребуется персональный компьютер с Microsoft Windows NT или Windows 2000 (можно и Workstation, и Server), установленный IIS (Internet Information Server), какой-нибудь HTML-редактор (советую использовать Macromedia Dreamweaver), Microsoft Access (версии 95, 97 или 2000) и самый обычный текстовый редактор. Создание и подготовка базы данныхПрежде всего создадим базу данных статей, для чего:
Далее необходимо прописать нашу базу данных в соответствующем разделе источников данных системы, для этого:
В результате в списке источников данных в вашей системе появится строка, представленная на рис. 3. Оформляем главную страницу (index.asp)С ASP работать очень просто. Для этого надо всего лишь вставить текст скрипта ASP в пару тэгов . В остальном ASP-файл ничем не отличается от HTML-файла (за исключением, пожалуй, расширения). Комментарии в HTML, как известно, вставляются в пару тэгов , в ASP же закомментировать строку можно при помощи символа ‘ (апостроф) в ее начале. Теперь давайте разберемся. Во-первых, как вы наверняка заметили, ASP-код легко сочетается с HTML-тэгами; в этом его достоинство. Так, к примеру, строка Response.Write Link & « Она по сути формирует ссылку на файл, содержащий шаблон отображения самой статьи, причем передает идентификатор статьи ему в качестве параметра. Полностью файл шаблона приведен в приложении к настоящей статье, а механизм его работы может быть кратко представлен следующим образом: Первая строчка скрипта шаблона 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.asaGlobal.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-форм, поэтому мы рассмотрим этот процесс, не вдаваясь в детали построения форм.) Прежде всего следует уточнить задачу на этом этапе. Итак, очевидно следующее:
Как видим, передача управления осуществляется благодаря директиве 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 Применение ASP-команд для изменения базы данных в DreamweaverНа этой странице Пользовательский интерфейс в Dreamweaver СС и более поздних версиях стал проще. В результате этого некоторые функции, описанные в этой статье, могут отсутствовать в Dreamweaver CC и более поздних версиях. Дополнительные сведения см. в этой статье. Об объектах команды ASPОбъект команды ASP — это объект сервера, выполняющий некоторую операцию с базой данных. Объект может содержать любой SQL-оператор, включая оператор возврата набора записей или оператор для вставки, обновления или удаления записей из базы данных. Объект команды может изменять структуру базы данных в случае, если SQL-оператор добавляет или удаляет столбец из таблицы. Объект команды можно также использовать для выполнения в базе данных хранимой процедуры. Объект команды может многократно использоваться в том смысле, что сервер приложений может многократно использовать простую откомпилированную версию объекта для выполнения команды несколько раз. Сделать команду многократно используемой можно с помощью задания свойству «Подготовленный» объекта «Команда» значения true , как это показано в следующем предложении VBScript. Если известно, что команда будет выполняться несколько раз, наличие простой откомпилированной версии объекта может увеличить эффективность операций с базой данных. Подготовленные команды поддерживаются не всеми поставщиками баз данных. Если база данных не поддерживает подготовленные команды, она может вернуть ошибку в случае, если свойству задано значение true . База данных может даже проигнорировать запрос на подготовку команды и задать свойство «Подготовленный» значение false . Объект команды создается сценариями на ASP-странице, но Dreamweaver позволяет создавать объекты команды без написания ASP-кода. Применение ASP-команд для изменения базы данныхDreamweaver можно использовать для создания объектов ASP-команд, выполняющих вставку, обновление или удаление записей из базы данных. Назначьте объекту команды SQL-оператор или хранимую процедуру, выполняющую операцию с базой данных. Dreamweaver выполняет SQL-оператор на основе типа выбранной операции. Например, если выбрана операция «Вставить», диалоговое окно выглядит примерно следующим образом: Более подробную информацию о создании SQL-операторов для изменения базы данных см. в руководстве по Transact‑SQL. В следующем примере показан оператор Insert с тремя переменными SQL. Значения этих переменных предоставляются параметрами URL-адреса, передаваемыми на страницу и определенными в столбце «Динамическое значение» в области «Переменные». Просмотреть значение «Размер» можно на панели «Базы данных» в Dreamweaver. Найдите нужную базу данных на панели «Базы данных» и разверните ее. Затем выберите рабочую таблицу и тоже разверните ее. В таблице указаны размеры полей. Например, ADDRESS (WChar 50). В данном примере размер равен 50. Также можно найти размер в приложении базы данных. Для типов данных «Числовой», «Логический» и «Дата/время» в качестве размера всегда используется -1. Для определения значения «Тип» см. нижеприведенную таблицу. Тип в базе данных Тип в Dreamweaver Числовой (MS Access, MS SQL Server, MySQL) С двойной точностью Логический, «Да»/«Нет» (MS Access, MS SQL Server, MySQL) С двойной точностью Дата/время (MS Access, MS SQL Server, MySQL) Все другие типы текстовых полей, включая типы текстовых данных MySQL char, varchar и longtext см. таблицу базы данных Текст (MS Access) или nvarchar, nchar (MS SQL Server) см. таблицу базы данных Memo (MS Access), ntext (MS SQL Server) или поля с поддержкой большого объема текста Более подробную информацию о типах и размерах SQL-переменных см. по адресу www.adobe.com/go/4e6b330a_ru. Dreamweaver вставляет в страницу ASP-код, который при выполнении на сервере создает команду вставки, обновления или удаления записей из базы данных. По умолчанию код задает свойству «Подготовленный» объекта команды значение true , то есть сервер приложений может многократно использовать простую откомпилированную версию объекта при каждом выполнении команды. Для изменения этой настройки переключитесь в представление кода и измените значение свойства «Подготовленный» на false . О хранимых процедурахХотя для создания страниц, изменяющих базы данных, можно использовать поведения сервера, с этой целью также можно применять такие объекты операций с базами данных, как хранимые процедуры или объекты ASP-команд. Хранимая процедура представляет собой многократно используемый элемент базы данных, выполняющий некоторую операцию с базой данных. Хранимая процедура содержит SQL-код, способный среди прочего вставлять, обновлять или удалять записи. Хранимые процедуры также могут изменять структуру самой базы данных. Например, хранимые процедуры можно применять для добавления в таблицу столбца или даже для удаления таблиц. Хранимая процедура может вызывать другие хранимые процедуры, а также принимать параметры ввода и возвращать значения в вызывающую процедуру в форме выходных параметров. Хранимая процедура является многократно используемой в том смысле, что простую откомпилированную версию процедуры можно использовать для многократного выполнения операции с базой данных. Если известно, что операция с базой данных будет выполняться много раз или одна задача будет выполняться различными приложениями, применение хранимой процедуры для выполнения этой операции повышает эффективность работы базы данных. Базы данных MySQL и Microsoft Access не поддерживают хранимые процедуры. Добавление хранимой процедуры (ColdFusion) (CS6)Хранимую процедуру можно использовать для изменения базы данных. Хранимая процедура представляет собой многократно используемый элемент базы данных, выполняющий некоторую операцию с базой данных. Перед изменением базы данных при помощи хранимой процедуры убедитесь, что в процедуре содержится SQL-код для некоторого изменения базы данных. Более подробную информацию о создании и размещении хранимых процедур в базе данных см. в документации по базе данных и руководство Transact-SQL. Учебник. Использование перехвата устойчивость и команду подключения с Entity Framework в приложении ASP.NET MVC Tutorial: Use connection resiliency and command interception with Entity Framework in an ASP.NET MVC appПока приложение будет выполняться локально в IIS Express на компьютере разработчика. So far the application has been running locally in IIS Express on your development computer. Чтобы реальных приложение стало доступным для других пользователей в Интернете, необходимо развернуть его на веб-поставщик услуг размещения и у вас есть развертывание базы данных на сервер базы данных. To make a real application available for other people to use over the Internet, you have to deploy it to a web hosting provider, and you have to deploy the database to a database server. В этом руководстве вы узнаете, как использовать перехвата устойчивость и команду подключения. In this tutorial you’ll learn how to use connection resiliency and command interception. Они являются две важные функции Entity Framework 6, которые особенно важны при развертывании в облачной среде: устойчивость подключений (автоматические повторы для временных ошибок) и перехват команд (catch все SQL-запросы, отправляемые базе данных для входа или изменять их). They are two important features of Entity Framework 6 that are especially valuable when you are deploying to the cloud environment: connection resiliency (automatic retries for transient errors) and command interception (catch all SQL queries sent to the database in order to log or change them). Учебником подключения устойчивость и команда перехвата является необязательным. This connection resiliency and command interception tutorial is optional. Если вы пропустите это руководство, будет лишь небольшие изменения, внесенные в последующих руководствах. If you skip this tutorial, a few minor adjustments will have to be made in subsequent tutorials. В этом учебнике рассмотрены следующие задачи. In this tutorial, you:
Предварительные требования PrerequisitesВключить устойчивость подключений Enable connection resiliencyПри развертывании приложения в Windows Azure, используется для развертывания базы данных в базу данных SQL Azure Windows, облачная служба баз данных. When you deploy the application to Windows Azure, you’ll deploy the database to Windows Azure SQL Database, a cloud database service. При подключении к облачная служба баз данных, чем при веб-сервер и сервер базы данных непосредственно соединены друг с другом в одном центре обработки данных, временных ошибок подключения обычно чаще. Transient connection errors are typically more frequent when you connect to a cloud database service than when your web server and your database server are directly connected together in the same data center. Даже если веб-сервер cloud и облачная служба баз данных размещаются в одном центре обработки данных, существуют дополнительные сетевые подключения между ними, которые могут возникнуть проблемы, такие как подсистемы балансировки нагрузки. Even if a cloud web server and a cloud database service are hosted in the same data center, there are more network connections between them that can have problems, such as load balancers. Также это облачная служба обычно совместно используется другими пользователями, это означает, что отклик может зависеть от их. Also a cloud service is typically shared by other users, which means its responsiveness can be affected by them. И доступ к базе данных может быть подвергаются регулированию. And your access to the database might be subject to throttling. Регулирование означает, что служба базы данных создает исключения, при попытке доступа к нему дополнительные часто не допускается в вашей уровень соглашения об уровне обслуживания. Throttling means the database service throws exceptions when you try to access it more frequently than is allowed in your Service Level Agreement (SLA). Многие или большинство проблем подключения при обращении к облачной службе являются временными, то есть они устранить самостоятельно за короткий период времени. Many or most connection problems when you’re accessing a cloud service are transient, that is, they resolve themselves in a short period of time. Поэтому при попытке выполнения операции базы данных получить тип ошибки, обычно временное, можно попробовать операцию после короткого ожидания и операции может пройти успешно. So when you try a database operation and get a type of error that is typically transient, you could try the operation again after a short wait, and the operation might be successful. Можно предоставить значительно удобней для пользователей, если обработка временных ошибок с автоматически повторить попытку, невидимую большинство из них для клиента. You can provide a much better experience for your users if you handle transient errors by automatically trying again, making most of them invisible to the customer. Функция устойчивости подключений в Entity Framework 6 автоматизирует, что процесс повторного не удалось выполнить SQL-запросов. The connection resiliency feature in Entity Framework 6 automates that process of retrying failed SQL queries. Функция устойчивости подключений должен быть настроен для определенной базы данных службы: The connection resiliency feature must be configured appropriately for a particular database service:
Можно настроить эти параметры вручную для любой среды базы данных, поддерживаемом поставщиком Entity Framework, но уже были настроены значения по умолчанию, которые обычно доступны также в интерактивном приложении, использующем базу данных SQL Azure Windows, и Это параметры, которые вы реализуете для приложения университета Contoso. You can configure these settings manually for any database environment supported by an Entity Framework provider, but default values that typically work well for an online application that uses Windows Azure SQL Database have already been configured for you, and those are the settings you’ll implement for the Contoso University application. Вам нужно выполнить, чтобы включить устойчивость подключения создать класс в сборке, производный от DbConfiguration и в этом классе присвоить базе данных SQL стратегия выполнения, в EF – еще один термин для политика повтора. All you have to do to enable connection resiliency is create a class in your assembly that derives from the DbConfiguration class, and in that class set the SQL Database execution strategy, which in EF is another term for retry policy. В папке DAL, добавьте файл класса с именем SchoolConfiguration.cs. In the DAL folder, add a class file named SchoolConfiguration.cs. Замените код шаблона следующим кодом: Replace the template code with the following code: Платформа Entity Framework автоматически выполняет код в класс, производный от DbConfiguration . The Entity Framework automatically runs the code it finds in a class that derives from DbConfiguration . Можно использовать DbConfiguration класса, чтобы выполнять задачи по настройке в коде, в противном случае это делается в Web.config файл. You can use the DbConfiguration class to do configuration tasks in code that you would otherwise do in the Web.config file. Дополнительные сведения см. в разделе EntityFramework конфигурация на основе кода. For more information, see EntityFramework Code-Based Configuration. В StudentController.cs, добавьте using инструкции для System.Data.Entity.Infrastructure . In StudentController.cs, add a using statement for System.Data.Entity.Infrastructure . Изменить все catch блокирует перехвата DataException исключения, чтобы они перехватывать RetryLimitExceededException исключения вместо этого. Change all of the catch blocks that catch DataException exceptions so that they catch RetryLimitExceededException exceptions instead. Пример: For example: Вы использовали DataException выявления ошибок, которые могут быть временными, чтобы обеспечить понятное сообщение «повторить». You were using DataException to try to identify errors that might be transient in order to give a friendly «try again» message. Но теперь, когда вы включили политику повтора, единственные ошибки, скорее всего, будут временными будет уже были испытаны и не удалось несколько раз, и фактическое возвращаемое исключение будет вставлено в RetryLimitExceededException исключение. But now that you’ve turned on a retry policy, the only errors likely to be transient will already have been tried and failed several times and the actual exception returned will be wrapped in the RetryLimitExceededException exception. Включить перехват команд Enable command interceptionТеперь, когда вы включили политику повтора, как протестировать чтобы убедиться, что он работает должным образом? Now that you’ve turned on a retry policy, how do you test to verify that it is working as expected? Это не так просто заставить временная ошибка происходит, особенно при работе локально, и было бы особенно трудно интегрировать фактическое временных ошибок в автоматизированные модульные тест. It’s not so easy to force a transient error to happen, especially when you’re running locally, and it would be especially difficult to integrate actual transient errors into an automated unit test. Чтобы протестировать функция устойчивости подключений, нужен способ перехватывать запросы, которые отправляет Entity Framework для SQL Server и замените типа исключения, которое обычно временное ответ от сервера SQL. To test the connection resiliency feature, you need a way to intercept queries that Entity Framework sends to SQL Server and replace the SQL Server response with an exception type that is typically transient. Перехват запросов также можно использовать для реализации рекомендации для облачных приложений: журнала задержки и успешность всех вызовов к внешним службам такие как службы базы данных. You can also use query interception in order to implement a best practice for cloud applications: log the latency and success or failure of all calls to external services such as database services. Предоставляет EF6 выделенной API ведения журнала , можно упростить его сделать ведения журнала, но в этом разделе руководства вы узнаете, как использовать Entity Framework механизма перехвата напрямую, как для Ведение журнала и для имитации временных ошибок. EF6 provides a dedicated logging API that can make it easier to do logging, but in this section of the tutorial you’ll learn how to use the Entity Framework’s interception feature directly, both for logging and for simulating transient errors. Создайте класс и интерфейс ведения журнала Create a logging interface and classОбъект рекомендация для ведения журнала — это с помощью интерфейса вместо жестко запрограммированного вызовы методов System.Diagnostics.Trace или класса ведения журнала. A best practice for logging is to do it by using an interface rather than hard-coding calls to System.Diagnostics.Trace or a logging class. Что упрощает изменение вашего механизма ведения позже, если вы захотите это сделать. That makes it easier to change your logging mechanism later if you ever need to do that. Поэтому в этом разделе мы создадим интерфейс ведения журнала и класса для реализации его/p > So in this section you’ll create the logging interface and a class to implement it./p> Создание папки в проект и назовите его ведение журнала. Create a folder in the project and name it Logging. В ведение журнала папке создайте файл класса с именем ILogger.csи замените код шаблона следующим кодом: In the Logging folder, create a class file named ILogger.cs, and replace the template code with the following code: Этот интерфейс предоставляет три уровня трассировки, чтобы указать относительную важность журналы и один, предоставляет сведения о задержке для внешней службы вызовы, такие как запросы к базе данных. The interface provides three tracing levels to indicate the relative importance of logs, and one designed to provide latency information for external service calls such as database queries. Методы ведения журнала имеют перегрузки, которые позволяют передавать исключение. The logging methods have overloads that let you pass in an exception. Это так, что сведения об исключении, включая стек трассировки и внутренние исключения надежно регистрируется классом, который реализует интерфейс, а не полагаться на который выполняется в каждом вызове метода ведения журнала в приложении. This is so that exception information including stack trace and inner exceptions is reliably logged by the class that implements the interface, instead of relying on that being done in each logging method call throughout the application. Методы TraceApi позволяют отслеживать задержку каждого вызова определенной внешней службы, такие как базы данных SQL. The TraceApi methods enable you to track the latency of each call to an external service such as SQL Database. В ведение журнала папке создайте файл класса с именем Logger.csи замените код шаблона следующим кодом: In the Logging folder, create a class file named Logger.cs, and replace the template code with the following code: Реализация использует System.Diagnostics для трассировки. The implementation uses System.Diagnostics to do the tracing. Это встроенная функция .NET, что позволяет легко создать и использовать данные трассировки. This is a built-in feature of .NET which makes it easy to generate and use tracing information. Существует много «прослушиватели» можно использовать с трассировкой System.Diagnostics записывать журналы к файлам, к примеру, или для записи их в хранилище BLOB-объектов Azure. There are many «listeners» you can use with System.Diagnostics tracing, to write logs to files, for example, or to write them to blob storage in Azure. Некоторые из вариантов, а также ссылки на другие ресурсы, Дополнительные сведения см. в Устранение неполадок веб-сайтов Azure в Visual Studio. See some of the options, and links to other resources for more information, in Troubleshooting Azure Web Sites in Visual Studio. Этот учебник позволяет только просмотреть журналы в Visual Studio вывода окна. For this tutorial you’ll only look at logs in the Visual Studio Output window. В рабочем приложении может потребоваться учитывать пакеты трассировки, отличный от System.Diagnostics и интерфейс ILogger позволяет относительно легко переключиться на механизм разных трассировки, если вы решили сделать это. In a production application you might want to consider tracing packages other than System.Diagnostics, and the ILogger interface makes it relatively easy to switch to a different tracing mechanism if you decide to do that. Создайте перехватчик классы Create interceptor classesТеперь необходимо создать классы, которые Entity Framework будет вызывать каждый раз, когда оно для отправки запроса к базе данных для имитации временных ошибок и сделать ведения журнала. Next you’ll create the classes that the Entity Framework will call into every time it is going to send a query to the database, one to simulate transient errors and one to do logging. Эти классы перехватчик должен быть производным от DbCommandInterceptor класса. These interceptor classes must derive from the DbCommandInterceptor class. В них вы напишете переопределения методов, которые вызываются автоматически в том случае, когда запрос будет выполняться. In them you write method overrides that are automatically called when query is about to be executed. В этих методах можно изучать или запрос, который отправляется в базу данных к журналу, а также можно изменить запрос перед отправкой в базу данных или возвращать результат Entity Framework самостоятельно без даже передача запроса к базе данных. In these methods you can examine or log the query that is being sent to the database, and you can change the query before it’s sent to the database or return something to Entity Framework yourself without even passing the query to the database. Чтобы создать класс перехватчик, которая будет записывать каждый запрос SQL, который отправляется в базу данных, создайте файл класса с именем SchoolInterceptorLogging.cs в DAL папку и замените код шаблона Следующий код: To create the interceptor class that will log every SQL query that is sent to the database, create a class file named SchoolInterceptorLogging.cs in the DAL folder, and replace the template code with the following code: Для успешно выполненных запросов или команд этот код записывает в журнал сведения с сведения о задержке. For successful queries or commands, this code writes an Information log with latency information. Для исключений он создает журнал ошибок. For exceptions, it creates an Error log. Для создания класса-перехватчика, вызывающая фиктивный временных ошибок при вводе «Throw» в поиска поле, создайте файл класса с именем SchoolInterceptorTransientErrors.cs в DAL папку и замените код шаблона следующим кодом: To create the interceptor class that will generate dummy transient errors when you enter «Throw» in the Search box, create a class file named SchoolInterceptorTransientErrors.cs in the DAL folder, and replace the template code with the following code: Этот код только переопределения ReaderExecuting метод, который вызывается для запросов, которые могут возвращать несколько строк данных. This code only overrides the ReaderExecuting method, which is called for queries that can return multiple rows of data. Если вы хотите проверить устойчивость подключения для других типов запросов, можно также переопределить NonQueryExecuting и ScalarExecuting методы, как ведение журнала перехватчик. If you wanted to check connection resiliency for other types of queries, you could also override the NonQueryExecuting and ScalarExecuting methods, as the logging interceptor does. При запуске страницы учащихся и введите «Throw» в строке поиска, этот код создает фиктивный исключение базы данных SQL для номер ошибки 20, типом, известным обычно временной. When you run the Student page and enter «Throw» as the search string, this code creates a dummy SQL Database exception for error number 20, a type known to be typically transient. Другие коды ошибок, момент опознаны как временные являются 64, 233, 10053, 10054, 10060, 10928, 10929, 40197, 40501 и 40613, но они могут быть изменены в новые версии базы данных SQL. Other error numbers currently recognized as transient are 64, 233, 10053, 10054, 10060, 10928, 10929, 40197, 40501, and 40613, but these are subject to change in new versions of SQL Database. Код возвращает исключение в Entity Framework, вместо выполнения запроса и передачи результатов запроса назад. The code returns the exception to Entity Framework instead of running the query and passing back query results. Временное исключение возвращается в четыре раза, а затем код возвращается к обычной процедуры передачи запроса к базе данных. The transient exception is returned four times, and then the code reverts to the normal procedure of passing the query to the database. Так как все, что в системе, вы сможете см. в разделе Entity Framework пытается выполнить запрос предшествовало в четыре раза, что в приложении отличается только что занимает больше времени для визуализации страницы с результатами запроса. Because everything is logged, you’ll be able to see that Entity Framework tries to execute the query four times before finally succeeding, and the only difference in the application is that it takes longer to render a page with query results. Количество раз, когда Entity Framework будет повторять попытку настраивается; код определяет четыре раза, потому что это значение по умолчанию для политики выполнения базы данных SQL. The number of times the Entity Framework will retry is configurable; the code specifies four times because that’s the default value for the SQL Database execution policy. Если изменить политику выполнения, необходимо было также изменение здесь расположен код, указывает, сколько раз создаются временные ошибки. If you change the execution policy, you’d also change the code here that specifies how many times transient errors are generated. Можно также изменить код, чтобы создать дополнительные исключения, чтобы платформа Entity Framework вызывает исключение RetryLimitExceededException исключение. You could also change the code to generate more exceptions so that Entity Framework will throw the RetryLimitExceededException exception. Значение, указанное в поле поиска будет находиться в command.Parameters[0] и command.Parameters[1] (один используется имя и фамилия). The value you enter in the Search box will be in command.Parameters[0] and command.Parameters[1] (one is used for the first name and one for the last name). Если найдено значение «% Throw %», «Throw» заменяется в эти параметры «», чтобы некоторые студенты будут найдены и возвращается. When the value «%Throw%» is found, «Throw» is replaced in those parameters by «an» so that some students will be found and returned. Это просто удобный способ проверить устойчивость подключений, в зависимости от изменяющихся некоторые входные данные для пользовательского интерфейса приложения. This is just a convenient way to test connection resiliency based on changing some input to the application UI. Можно также написать код для создания временных ошибок для всех запросов или обновлений, как описано далее в комментарии о DbInterception.Add метод. You can also write code that generates transient errors for all queries or updates, as explained later in the comments about the DbInterception.Add method. В Global.asax, добавьте следующий using инструкции: In Global.asax, add the following using statements: Добавьте выделенные строки, чтобы Application_Start метод: Add the highlighted lines to the Application_Start method: Эти строки кода являются, что вызывает перехватчик кода для запуска в том случае, когда Entity Framework отправляет запросы к базе данных. These lines of code are what causes your interceptor code to be run when Entity Framework sends queries to the database. Обратите внимание, что так как вы создали отдельные перехватчик классы для имитации временных ошибок и ведение журнала, вы можете независимо друг от друга, включить или отключить их. Notice that because you created separate interceptor classes for transient error simulation and logging, you can independently enable and disable them. Можно добавить с помощью перехватчики DbInterception.Add метод в любом месте кода; он не должен быть в Application_Start метод. You can add interceptors using the DbInterception.Add method anywhere in your code; it doesn’t have to be in the Application_Start method. Другой вариант — поместить этот код в класс DbConfiguration, который был создан ранее, чтобы настроить политику выполнения. Another option is to put this code in the DbConfiguration class that you created earlier to configure the execution policy. Везде, где поместить этот код, нужно избегать выполнения DbInterception.Add для же перехватчик более чем один раз, или вы получите дополнительные перехватчик экземпляров. Wherever you put this code, be careful not to execute DbInterception.Add for the same interceptor more than once, or you’ll get additional interceptor instances. Например если дважды добавить перехватчик ведения журнала, вы увидите два журнала для каждого запроса SQL. For example, if you add the logging interceptor twice, you’ll see two logs for every SQL query. Перехватчики выполняются в порядке регистрации (порядок, в котором DbInterception.Add вызывается метод). Interceptors are executed in the order of registration (the order in which the DbInterception.Add method is called). Порядок может имеет значения в зависимости от выполняемых задач в перехватчик. The order might matter depending on what you’re doing in the interceptor. Например, перехватчик может изменить команду SQL, получаемый в CommandText свойство. For example, an interceptor might change the SQL command that it gets in the CommandText property. Если это приводит к изменению команду SQL, далее перехватчик получите измененные команду SQL, не исходную команду SQL. If it does change the SQL command, the next interceptor will get the changed SQL command, not the original SQL command. Вы написали код имитации временной ошибки способом, который позволяет вызывать временные ошибки, введя другое значение в пользовательском Интерфейсе. You’ve written the transient error simulation code in a way that lets you cause transient errors by entering a different value in the UI. Кроме того можно написать код перехватчик всегда создать последовательность временных исключений без проверки на наличие значения определенного параметра. As an alternative, you could write the interceptor code to always generate the sequence of transient exceptions without checking for a particular parameter value. Затем вы сможете добавить перехватчик только в том случае, если вы хотите создавать временные ошибки. You could then add the interceptor only when you want to generate transient errors. Если в этом случае не добавляйте перехватчик до после завершения инициализации базы данных. If you do this, however, don’t add the interceptor until after database initialization has completed. Другими словами выполните операции по крайней мере одна база данных, например запрос на одном из своего набора сущностей, перед началом создания временных ошибок. In other words, do at least one database operation such as a query on one of your entity sets before you start generating transient errors. Платформа Entity Framework выполняет несколько запросов во время инициализации базы данных, и они не выполняются в транзакции, в случае ошибки во время инициализации может возникнуть контекст которого необходимо получить в несогласованное состояние. The Entity Framework executes several queries during database initialization, and they aren’t executed in a transaction, so errors during initialization could cause the context to get into an inconsistent state. Протестируйте новую конфигурацию Test the new configurationНажмите клавишу F5 запустите приложение в режиме отладки, и нажмите кнопку учащихся вкладки. Press F5 to run the application in debug mode, and then click the Students tab. Посмотрите на Visual Studio вывода окно, чтобы просмотреть выходные данные трассировки. Look at the Visual Studio Output window to see the tracing output. Может потребоваться прокрутить вверх после некоторых ошибок JavaScript, чтобы получить журналы, сохраняемые в средство ведения журналов. You might have to scroll up past some JavaScript errors to get to the logs written by your logger. Обратите внимание на то, что вы видите фактические SQL-запросы, отправляемые в базу данных. Notice that you can see the actual SQL queries sent to the database. Вы увидите некоторые начальные запросы и команды, которые Entity Framework выполняет обновление, чтобы приступить к работе, проверка версии базы данных и таблицы журнала миграции (вы узнаете о миграции в следующем учебном курсе). You see some initial queries and commands that Entity Framework does to get started, checking the database version and migration history table (you’ll learn about migrations in the next tutorial). Появится запрос для разбиения на страницы, чтобы узнать, сколько учащихся, и наконец видеть запрос, который получает данные об учащихся. And you see a query for paging, to find out how many students there are, and finally you see the query that gets the student data. В учащихся странице введите «Throw» в строке поиска и нажмите кнопку поиска. In the Students page, enter «Throw» as the search string, and click Search. Вы заметите, что браузер кажется зависает на несколько секунд, пока Entity Framework повторением запроса несколько раз. You’ll notice that the browser seems to hang for several seconds while Entity Framework is retrying the query several times. Первый Повтор происходит очень быстро, затем ожидать увеличения перед каждой следующей попытки. The first retry happens very quickly, then the wait before increases before each additional retry. Процесс больше ожидания перед каждым повтором называется экспоненциального откладывания. This process of waiting longer before each retry is called exponential backoff. При отображении страницы отображение учащиеся имеют «значение» в именах, посмотрите в окно вывода, и вы увидите, что тот же запрос количество предпринятых попыток пяти, первые четыре раза возвращением временных исключений. When the page displays, showing students who have «an» in their names, look at the output window, and you’ll see that the same query was attempted five times, the first four times returning transient exceptions. Для каждой временной ошибки вы увидите журнала, создаваемого при создании временной ошибке в SchoolInterceptorTransientErrors класс («возвращение временная ошибка команды. ») и вы увидите журнала, записанных при SchoolInterceptorLogging возвращает исключение. For each transient error you’ll see the log that you write when generating the transient error in the SchoolInterceptorTransientErrors class («Returning transient error for command. «) and you’ll see the log written when SchoolInterceptorLogging gets the exception. Так как вы ввели строку поиска, параметризован запрос, который возвращает данные об учащихся: Since you entered a search string, the query that returns student data is parameterized: Значения параметров не выполняется вход, но это можно сделать. You’re not logging the value of the parameters, but you could do that. Если вы хотите просмотреть значения параметра, можно написать код ведения журнала, чтобы получить значения параметров из Parameters свойство DbCommand объект, который вы получаете в методы перехватчика. If you want to see the parameter values, you can write logging code to get parameter values from the Parameters property of the DbCommand object that you get in the interceptor methods. Обратите внимание на то, что нельзя повторите этот тест, если вы остановите приложение и перезапустите его. Note that you can’t repeat this test unless you stop the application and restart it. Если вы хотите иметь возможность тестировать устойчивость подключения несколько раз в рамках одного запуска приложения, можно написать код, чтобы сбросить счетчик ошибок в SchoolInterceptorTransientErrors . If you wanted to be able to test connection resiliency multiple times in a single run of the application, you could write code to reset the error counter in SchoolInterceptorTransientErrors . Чтобы увидеть разницу стратегии выполнения (политика повтора) делает, комментарий SetExecutionStrategy строку в SchoolConfiguration.cs, снова запустите на страницу учащихся в режиме отладки и повторить поиск «Throw». To see the difference the execution strategy (retry policy) makes, comment out the SetExecutionStrategy line in SchoolConfiguration.cs, run the Students page in debug mode again, and search for «Throw» again. Это время отладчик останавливается на первой порожденное исключение немедленно в том случае, когда предпринимается попытка выполнения запроса в первый раз. This time the debugger stops on the first generated exception immediately when it tries to execute the query the first time. Раскомментируйте SetExecutionStrategy строку в SchoolConfiguration.cs. Uncomment the SetExecutionStrategy line in SchoolConfiguration.cs. Получение кода Get the codeДополнительные ресурсы Additional resourcesСсылки на другие ресурсы Entity Framework можно найти в доступ к данным ASP.NET — рекомендуемые ресурсы. Links to other Entity Framework resources can be found in ASP.NET Data Access — Recommended Resources. Следующие шаги Next stepsВ этом учебнике рассмотрены следующие задачи. In this tutorial, you:
Перейдите к следующей статьи вы узнаете о Code First migrations и развертывание Azure. Advance to the next article to learn about Code First migrations and Azure deployment. |