Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В предыдущих руководствах мы узнали, как элемент управления ObjectDataSource разрешен для вставки, обновления и удаления данных. Элемент управления SqlDataSource поддерживает те же операции, но подход отличается, и в этом руководстве показано, как настроить SqlDataSource для вставки, обновления и удаления данных.
Введение
Как описано в обзоре вставки, обновления и удаления, элемент управления GridView предоставляет встроенные возможности обновления и удаления, а элементы управления DetailsView и FormView включают поддержку вставки вместе с функциями редактирования и удаления. Эти возможности изменения данных можно подключить непосредственно к элементу управления источниками данных без строки кода, необходимой для записи. Обзор вставки, обновления и удаления с помощью ObjectDataSource для упрощения вставки, обновления и удаления с помощью элементов управления GridView, DetailsView и FormView. Кроме того, sqlDataSource можно использовать вместо ObjectDataSource.
Помните, что для поддержки вставки, обновления и удаления с помощью ObjectDataSource необходимо указать методы слоя объектов для вызова для выполнения действия вставки, обновления или удаления. С помощью SqlDataSource необходимо предоставить инструкции SQL (или хранимые процедуры) INSERT
, UPDATE
и DELETE
для выполнения. Как показано в этом руководстве, эти инструкции можно создавать вручную или автоматически создавать с помощью мастера настройки источника данных SqlDataSource.
Замечание
Так как мы уже обсуждали возможности вставки, редактирования и удаления элементов управления GridView, DetailsView и FormView, в этом руководстве будет сосредоточено внимание на настройке элемента управления SqlDataSource для поддержки этих операций. Если вам нужно приступить к реализации этих функций в GridView, DetailsView и FormView, вернитесь к учебникам по редактированию, вставке и удалению данных, начиная с обзора вставки, обновления и удаления.
Шаг 1. Определение инструкций INSERT, UPDATE и DELETE
Как мы видели в последних двух руководствах, чтобы получить данные из элемента управления SqlDataSource, необходимо задать два свойства:
-
ConnectionString
, определяющий, в какую базу данных нужно отправить запрос, и -
SelectCommand
— указывает SQL-запрос ad-hoc или имя хранимой процедуры для выполнения и возврата результатов.
Для SelectCommand
значений с параметрами значения параметров задаются с помощью коллекции SqlDataSource SelectParameters
и могут содержать жестко закодированные значения, общие значения источника параметров (поля запроса, переменные сеанса, значения веб-элемента управления и т. д.) или могут быть программным образом назначены. Когда метод элемента управления SqlDataSource вызывается программно или автоматически из веб-элемента управления данными, устанавливается соединение с базой данных, значения параметров передаются в запрос, и команда отправляется в базу данных. Затем результаты возвращаются в виде DataSet или DataReader в зависимости от значения свойства DataSourceMode
элемента управления.
Наряду с выбором данных, элемент управления SqlDataSource можно использовать для вставки, обновления и удаления данных, предоставляя инструкции SQL с помощью INSERT
, UPDATE
и DELETE
таким же образом. Просто назначьте свойствам InsertCommand
, UpdateCommand
и DeleteCommand
инструкции SQL INSERT
, UPDATE
и DELETE
для выполнения. Если операторы имеют параметры (что чаще всего бывает), включите их в коллекции InsertParameters
, UpdateParameters
и DeleteParameters
.
После указания значения параметров InsertCommand
, UpdateCommand
или DeleteCommand
станут доступны параметры "Включить вставку", "Включить редактирование" или "Включить удаление" в смарт-теге соответствующего веб-элемента управления данными. Чтобы проиллюстрировать это, давайте рассмотрим пример со Querying.aspx
страницы, которую мы создали в учебнике Запрос данных с помощью элемента управления SqlDataSource, и доработаем его, чтобы добавить возможности удаления.
Начните с открытия InsertUpdateDelete.aspx
и Querying.aspx
страниц из SqlDataSource
папки. На странице конструктора Querying.aspx
выберите SqlDataSource и GridView в первом примере ( ProductsDataSource
и GridView1
элементы управления). Выбрав два элемента управления, перейдите в меню "Изменить" и выберите "Копировать" (или просто нажмите клавиши CTRL+C). Затем откройте конструктор InsertUpdateDelete.aspx
и вставьте элементы управления. После того, как вы перенесете два элемента управления в InsertUpdateDelete.aspx
, протестируйте страницу в браузере. Вы должны видеть значения столбцов ProductID
, ProductName
и UnitPrice
для всех записей в таблице базы данных Products
.
Рис. 1. Все продукты перечислены, упорядочены по (ProductID
щелкните, чтобы просмотреть изображение полного размера)
Добавление свойств DeleteCommand и DeleteParameters в SqlDataSource
На этом этапе у нас есть SqlDataSource, который просто возвращает все записи из Products
таблицы и GridView, которые отрисовывают эти данные. Наша цель — расширить этот пример, чтобы разрешить пользователю удалять продукты с помощью GridView. Для выполнения этого необходимо задать значения для свойств DeleteCommand
и DeleteParameters
элемента управления SqlDataSource, а затем настроить GridView для поддержки операции удаления.
Свойства DeleteCommand
и DeleteParameters
можно указать различными способами.
- С помощью декларативного синтаксиса
- Из окна "Свойства" в конструкторе
- На экране "Указание пользовательской инструкции SQL" или "Хранимая процедура" в мастере настройки источника данных
- С помощью кнопки "Дополнительно" на экране "Указание столбцов из таблицы представлений" в мастере настройки источника данных, который автоматически создает SQL запрос
DELETE
и коллекцию параметров, используемую в свойствахDeleteCommand
иDeleteParameters
.
Мы рассмотрим, как автоматически создать инструкцию DELETE
на шаге 2. Теперь давайте будем использовать окно "Свойства" в конструкторе, хотя мастер настройки источника данных или декларативный синтаксис будут работать так же.
В конструкторе InsertUpdateDelete.aspx
щелкните на ProductsDataSource
SqlDataSource и откройте окно "Свойства" (в меню "Вид" выберите "Свойства" или просто нажмите клавишу F4). Выберите свойство DeleteQuery, которое откроет набор многоточий.
Рис. 2. Выбор свойства DeleteQuery в окне свойств
Замечание
SqlDataSource не имеет свойства DeleteQuery. Скорее, DeleteQuery представляет собой комбинацию свойств DeleteCommand
и DeleteParameters
и появляется в окне свойств только при просмотре через Дизайнер. Если вы просматриваете окно "Свойства" в режиме исходного кода, вместо этого вы найдете свойство DeleteCommand
.
Щелкните многоточие в свойстве DeleteQuery, чтобы открыть диалоговое окно "Редактор команд и параметров" (см. рис. 3). В этом диалоговом окне можно указать инструкцию DELETE
SQL и указать параметры. Введите следующий запрос в DELETE
текстовое поле команды (вручную или с помощью построителя запросов, если вы предпочитаете):
DELETE FROM Products
WHERE ProductID = @ProductID
Затем нажмите кнопку "Обновить параметры", чтобы добавить @ProductID
параметр в список параметров ниже.
@ProductID добавленным в список параметров команды DELETE". />
Рис. 3. Выберите свойство DeleteQuery в окне свойств (щелкните, чтобы просмотреть изображение полного размера)
Не указывайте значение для этого параметра (оставьте его источник параметра в позиции "Нет"). После добавления поддержки удаления в GridView элемент GridView автоматически будет предоставлять это значение параметра, используя значение своей DataKeys
коллекции для строки, кнопка "Удалить" которой была нажата.
Замечание
Имя параметра, используемое DELETE
в запросе, должно совпадать с именем DataKeyNames
значения в GridView, DetailsView или FormView. То есть параметр в инструкции DELETE
намеренно называется @ProductID
(а не, скажем, @ID
), потому что имя первичного ключевого столбца в таблице Products (и, следовательно, значение DataKeyNames в GridView) - ProductID
.
Если имя и DataKeyNames
значение параметра не совпадают, GridView не может автоматически назначить параметру значение из DataKeys
коллекции.
После ввода сведений, связанных с удалением, в диалоговом окне редактора команд и параметров нажмите кнопку "ОК" и перейдите в представление источника, чтобы проверить результирующую декларативную разметку.
<asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]"
DeleteCommand="DELETE FROM Products WHERE ProductID = @ProductID">
<DeleteParameters>
<asp:Parameter Name="ProductID" />
</DeleteParameters>
</asp:SqlDataSource>
Обратите внимание на добавление свойства DeleteCommand
, раздела <DeleteParameters>
и объекта с именем Parameter productID
.
Настройка GridView для удаления
После добавления свойства DeleteCommand
, смарт-тег GridView теперь содержит опцию "Включить удаление". Пройдите и установите этот флажок. Как обсуждалось в обзоре вставки, обновления и удаления, это приводит к тому, что GridView добавляет CommandField с его свойством ShowDeleteButton
на True
. Как показано на рисунке 4, при посещении страницы через браузер включена кнопка "Удалить". Проверьте эту страницу, удалив некоторые продукты.
Рис. 4. Каждая строка GridView теперь включает кнопку удаления (нажмите, чтобы просмотреть изображение полного размера)
При нажатии кнопки "Удалить" возникает обратная передача данных, GridView назначает значение параметра ProductID
из значения коллекции DataKeys
для строки, в которой была нажата кнопка "Удалить", и вызывает метод Delete()
источника данных SqlDataSource. Затем элемент управления SqlDataSource подключается к базе данных и выполняет инструкцию DELETE
. Затем GridView повторно привязывается к SqlDataSource, загружая и отображая текущий набор продуктов, который больше не включает недавно удаленную запись.
Замечание
Так как GridView использует свою DataKeys
коллекцию для заполнения параметров SqlDataSource, важно, чтобы свойство GridView DataKeyNames
было задано столбцам, составляющим первичный ключ, и что sqlDataSource SelectCommand
возвращает эти столбцы. Кроме того, важно, чтобы имя параметра в SqlDataSource было установлено как DeleteCommand
и задано значение @ProductID
. Если свойство DataKeyNames
не задано или параметр не имеет имени @ProductsID
, нажатие кнопки "Удалить" вызовет обратное отправление данных, но на самом деле не удалит никакую запись.
На рисунке 5 показано это взаимодействие графически. Вернитесь к руководству по изучению событий, связанных с вставкой, обновлением и удалением, для более подробного обсуждения последовательности событий, связанных с вставкой, обновлением и удалением из веб-контрола данных.
Рис. 5. Нажатие кнопки "Удалить" в GridView вызывает метод SqlDataSource Delete()
Шаг 2. Автоматическое создание инструкций INSERT
, UPDATE
, и DELETE
Как было рассмотрено в Шаге 1, операторы SQL INSERT
, UPDATE
, и DELETE
могут быть указаны через окно свойств или декларативным синтаксисом элемента управления. Однако этот подход требует, чтобы мы вручную писали инструкции SQL, которые могут быть монотонными и подверженными ошибкам. К счастью, мастер настройки источника данных предоставляет возможность автоматически создавать операторы INSERT
, UPDATE
и DELETE
при использовании экрана "Указание столбцов из таблицы или представления".
Давайте исследуем эту опцию автоматического создания. Добавьте элемент DetailsView в конструктор InsertUpdateDelete.aspx
и установите для свойства ID
значение ManageProducts
. Затем из смарт-тега DetailsView выберите создать новый источник данных и создать sqlDataSource с именем ManageProductsDataSource
.
Рис. 6. Создание нового имени ManageProductsDataSource
SqlDataSource (щелкните, чтобы просмотреть изображение полного размера)
В мастере настройки источника данных выберите строку NORTHWINDConnectionString
подключения и нажмите кнопку "Далее". На экране "Настройка инструкции выбора" оставьте выбранным радиокнопку "Указать столбцы из таблицы или представления" и выберите таблицу Products
из раскрывающегося списка. Выберите столбцы ProductID
, ProductName
, UnitPrice
и Discontinued
из списка флажков.
Рис. 7. Использование Products
таблицы, возвращение ProductID
, ProductName
, UnitPrice
, и Discontinued
столбцы (Нажмите, чтобы увидеть изображение в полном размере)
Чтобы автоматически создать инструкции INSERT
, UPDATE
и DELETE
на основе выбранной таблицы и столбцов, нажмите кнопку "Дополнительно" и установите флажок "Создать инструкции INSERT
, UPDATE
и DELETE
".
Рис. 8. Установите флажки "Сгенерировать INSERT
", "UPDATE
", и "DELETE
инструкции"
Флажок "Создать INSERT
, UPDATE
, и DELETE
операторы" можно будет отметить только в том случае, если в выбранной таблице есть первичный ключ, и столбец (или столбцы) первичного ключа включены в список возвращаемых столбцов. Флажок "Использовать оптимистичный параллелизм", который становится доступным после установки флажка "Создать INSERT
, UPDATE
, и DELETE
инструкции", добавит WHERE
условия в результирующие UPDATE
и DELETE
инструкции для обеспечения управления оптимистичным параллелизмом. В настоящее время оставьте этот флажок не отмеченным; мы рассмотрим оптимистическую конкурентность с элементом управления SqlDataSource в следующем учебнике.
После проверки флажка "Создать операторы INSERT
, UPDATE
, и DELETE
" нажмите кнопку "ОК", чтобы вернуться на экран "Настройка инструкции SELECT", а затем нажмите кнопку "Далее", а затем "Готово", чтобы завершить настройку мастера источника данных. После завершения работы мастера Visual Studio добавит BoundFields в DetailsView для столбцов ProductID
, ProductName
и UnitPrice
, а также CheckBoxField для столбца Discontinued
. В смарт-теге DetailsView проверьте параметр "Включить разбиение по страницам", чтобы пользователь, посещающий эту страницу, мог пройти по продуктам. Кроме того, удалите свойства Width
и Height
для DetailsView.
Обратите внимание, что смарт-тег содержит доступные параметры включения вставки, включения редактирования и включения удаления. Это связано с тем, что SqlDataSource содержит значения для его InsertCommand
, UpdateCommand
и DeleteCommand
, как показано в следующем декларативном синтаксисе:
<asp:DetailsView ID="ManageProducts" runat="server" AllowPaging="True"
AutoGenerateRows="False" DataKeyNames="ProductID"
DataSourceID="ManageProductsDataSource" EnableViewState="False">
<Fields>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
SortExpression="UnitPrice" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="ManageProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
DeleteCommand=
"DELETE FROM [Products] WHERE [ProductID] = @ProductID"
InsertCommand=
"INSERT INTO [Products] ([ProductName], [UnitPrice], [Discontinued])
VALUES (@ProductName, @UnitPrice, @Discontinued)"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice], [Discontinued]
FROM [Products]"
UpdateCommand=
"UPDATE [Products] SET [ProductName] = @ProductName,
[UnitPrice] = @UnitPrice, [Discontinued] = @Discontinued
WHERE [ProductID] = @ProductID">
<DeleteParameters>
<asp:Parameter Name="ProductID" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
<asp:Parameter Name="ProductID" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
</InsertParameters>
</asp:SqlDataSource>
Обратите внимание, что элемент управления SqlDataSource автоматически имеет заданные значения для своих свойств InsertCommand
, UpdateCommand
и DeleteCommand
. Набор столбцов, на которые ссылаются свойства InsertCommand
и UpdateCommand
, основан на тех, что указаны в заявлении SELECT
. Т. е. вместо того, чтобы иметь каждый столбец Products в InsertCommand
и UpdateCommand
, имеются только те столбцы, которые указаны в SelectCommand
(за исключением ProductID
, который пропущен, так как это IDENTITY
столбец, значение которого невозможно изменить при редактировании и которое автоматически назначается при вставке). Кроме того, для каждого параметра в свойствах InsertCommand
, UpdateCommand
, и DeleteCommand
имеются соответствующие параметры в коллекциях InsertParameters
, UpdateParameters
, и DeleteParameters
.
Чтобы включить функции изменения данных в DetailsView, отметьте параметры Включение вставки, Включение редактирования и Включение удаления в его интеллектуальной метке. Добавляется CommandField с установленными свойствами ShowInsertButton
, ShowEditButton
и ShowDeleteButton
для True
.
Посетите страницу в браузере и обратите внимание на кнопки "Изменить", "Удалить" и "Новый", включенные в компоненте DetailsView. Нажатие кнопки "Изменить" преобразует DetailsView в режим редактирования, который отображает каждый BoundField, свойство которого ReadOnly
задано False
(по умолчанию) в качестве текстового поля, и CheckBoxField в качестве флажка.
Рис. 9. Интерфейс редактирования DetailsView по умолчанию (щелкните, чтобы просмотреть изображение полного размера)
Аналогичным образом можно удалить выбранный в данный момент продукт или добавить новый продукт в систему. Так как оператор InsertCommand
работает только со столбцами ProductName
, UnitPrice
и Discontinued
, другим столбцам назначается NULL
или их значение по умолчанию, установленное базой данных при вставке. Как и в случае с объектом ObjectDataSource, если в InsertCommand
отсутствуют любые столбцы таблицы базы данных, которые не допускают значения NULL и не имеют значения по умолчанию, при попытке выполнить инструкцию NULL
возникнет ошибка SQL.
Замечание
Интерфейсы вставки и редактирования DetailsView не имеют каких-либо настроек или проверки. Чтобы добавить элементы управления проверки или настроить интерфейсы, необходимо преобразовать BoundFields в TemplateFields. Дополнительные сведения см. в руководстве по добавлению элементов управления проверки в интерфейсы редактирования и вставки и настройке интерфейса изменения данных .
Кроме того, помните, что при обновлении и удалении в DetailsView используется значение для текущего продукта DataKey
, которое присутствует только если свойство DataKeyNames
настроено. Если изменение или удаление не влияют, убедитесь, что DataKeyNames
свойство задано.
Ограничения автоматического создания инструкций SQL
Так как параметр "СоздатьINSERT
", UPDATE
и DELETE
операторы доступны только при выборе столбцов из таблицы, для более сложных запросов вам потребуется написать ваши собственные INSERT
, UPDATE
и DELETE
операторы, как мы сделали на шаге 1. Как правило, инструкции SQL SELECT
используют JOIN
для возврата данных из одной или нескольких таблиц подстановки для отображения (например, возвращая поле Categories
таблицы CategoryName
при отображении сведений о продукте). В то же время может потребоваться разрешить пользователю изменять, обновлять или вставлять данные в основную таблицу (Products
в данном случае).
Хотя инструкции INSERT
, UPDATE
, и DELETE
можно вводить вручную, рассмотрите следующий совет по экономии времени. Первоначально настройте SqlDataSource, чтобы он оттащил данные только из Products
таблицы. Используйте мастер настройки источника данных на экране указания столбцов из таблицы или представления, чтобы автоматически создавать инструкции INSERT
, UPDATE
и DELETE
. После завершения работы мастера выберите настройку SelectQuery в окне свойств (или вернитесь в мастер настройки источника данных и используйте опцию "Указать пользовательский SQL-запрос или хранимую процедуру"). Затем обновите инструкцию SELECT
, чтобы синтаксис JOIN
был включен. Этот метод обеспечивает экономию времени для автоматически созданных инструкций SQL и позволяет использовать более настраиваемую SELECT
инструкцию.
Другое ограничение автоматической генерации операторов INSERT
, UPDATE
и DELETE
состоит в том, что столбцы в инструкциях INSERT
и UPDATE
основаны на столбцах, возвращаемых инструкцией SELECT
. Однако нам может потребоваться обновить или вставить больше или меньше полей. Например, в примере из шага 2, возможно, мы хотим сделать UnitPrice
BoundField только для чтения. В этом случае он не должен появляться в компоненте UpdateCommand
. Или же может потребоваться задать значение поля таблицы, которое не отображается в GridView. Например, чтобы при добавлении новой записи значение QuantityPerUnit
было установлено на "TODO".
Если такие настройки необходимы, их необходимо сделать вручную либо в окне свойств, либо указать пользовательскую инструкцию SQL или хранимую процедуру в мастере, либо с помощью декларативного синтаксиса.
Замечание
При добавлении параметров, не имеющих соответствующих полей в веб-элементе управления данными, следует учитывать, что эти значения параметров должны быть назначены каким-то образом. Эти значения могут быть: жестко закодированные непосредственно в InsertCommand
или UpdateCommand
; могут поступать из определенного предварительно определенного источника (запросы, состояние сеанса, веб-элементы управления на странице и т. д.) или могут быть назначены программным способом, как мы видели в предыдущем руководстве.
Сводка
Чтобы веб-элементы управления данными могли использовать свои встроенные возможности по вставке, редактированию и удалению, элемент управления источником данных, к которому они привязаны, должен предоставлять такую функциональность. Для SqlDataSource это означает, что операторы SQL INSERT
, UPDATE
и DELETE
должны быть назначены свойствам InsertCommand
, UpdateCommand
и DeleteCommand
. Эти свойства и соответствующие коллекции параметров можно добавлять вручную или создавать автоматически с помощью мастера настройки источника данных. В этом руководстве мы рассмотрели оба метода.
Мы изучили использование оптимистического параллелизма с ObjectDataSource в руководстве по реализации оптимистического параллелизма . Элемент управления SqlDataSource также обеспечивает поддержку оптимистического параллелизма. Как отмечалось на шаге 2, при автоматическом создании операторов INSERT
, UPDATE
, и инструкций DELETE
мастер предлагает параметр "Использовать оптимистичную конкурентность". Как мы увидим в следующем руководстве, использование оптимистичной параллельности с SqlDataSource изменяет WHERE
условия в UPDATE
и DELETE
операторах, чтобы убедиться, что значения для других столбцов не изменились после последнего отображения данных на странице.
Счастливое программирование!
Сведения о авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга — Sams Teach Yourself ASP.NET 2.0 за 24 часа. С ним можно связаться по адресу mitchell@4GuysFromRolla.com.