Вставка, обновление и удаление данных с помощью элемента управления SqlDataSource (VB)
В предыдущих руководствах мы узнали, как элемент управления ObjectDataSource позволяет вставлять, обновлять и удалять данные. Элемент управления SqlDataSource поддерживает те же операции, но подход отличается, и в этом руководстве показано, как настроить SqlDataSource для вставки, обновления и удаления данных.
Введение
Как описано в статье Общие сведения о вставке, обновлении и удалении, элемент управления GridView предоставляет встроенные возможности обновления и удаления, а элементы управления DetailsView и FormView включают поддержку вставки вместе с функциями редактирования и удаления. Эти возможности изменения данных можно подключить непосредственно к элементу управления источником данных без написания строки кода. Общие сведения о вставке, обновлении и удалении рассматриваются с помощью ObjectDataSource для упрощения вставки, обновления и удаления с помощью элементов управления GridView, DetailsView и FormView. Кроме того, вместо ObjectDataSource можно использовать SqlDataSource.
Напомним, что для поддержки вставки, обновления и удаления с помощью ObjectDataSource необходимо указать методы уровня объектов для вызова для выполнения действия вставки, обновления или удаления. В SqlDataSource необходимо предоставить INSERT
инструкции SQL , UPDATE
и DELETE
(или хранимые процедуры) для выполнения. Как мы увидим в этом руководстве, эти инструкции можно создавать вручную или автоматически создавать с помощью мастера настройки источника данных SqlDataSource.
Примечание
Так как мы уже обсуждали возможности вставки, редактирования и удаления элементов управления GridView, DetailsView и FormView, в этом руководстве основное внимание уделяется настройке элемента управления SqlDataSource для поддержки этих операций. Если вам нужно освежить реализацию этих функций в GridView, DetailsView и FormView, вернитесь к руководствам По редактированию, вставке и удалению данных, начиная с обзора вставки, обновления и удаления данных.
Шаг 1. Указание инструкций INSERT, UPDATE и DELETE
Как мы видели в предыдущих двух руководствах, для получения данных из элемента управления SqlDataSource необходимо задать два свойства:
ConnectionString
, который указывает, в какую базу данных отправляется запрос, иSelectCommand
, задающий нерегламентированный SQL-инструкцию или имя хранимой процедуры, выполняемой для возврата результатов.
Для SelectCommand
значений с параметрами значения параметров указываются с помощью коллекции SqlDataSource и могут включать жестко заданные значения, общие исходные значения параметров (поля строки запросов, переменные сеанса SelectParameters
, значения веб-элементов управления и т. д.) или могут быть назначены программным способом. Когда метод элемента управления Select()
SqlDataSource вызывается программным или автоматически из веб-элемента управления данными, устанавливается подключение к базе данных, значения параметров назначаются запросу, а команда отправляется в базу данных. Затем результаты возвращаются как DataSet или DataReader в зависимости от значения свойства элемента управления DataSourceMode
.
Наряду с выбором данных элемент управления SqlDataSource можно использовать для вставки, обновления и удаления данных путем предоставления INSERT
инструкций , UPDATE
и DELETE
SQL практически таким же образом. Просто назначьте InsertCommand
свойства , UpdateCommand
и DeleteCommand
инструкции INSERT
SQL , UPDATE
и DELETE
. Если инструкции имеют параметры (как это обычно бывает), включите их в InsertParameters
коллекции , UpdateParameters
и DeleteParameters
.
InsertCommand
После указания значения , UpdateCommand
или DeleteCommand
станет доступен параметр Включить вставку, Включить редактирование или Включить удаление в смарт-теге соответствующего веб-элемента управления данными. Чтобы проиллюстрировать это, возьмем пример со Querying.aspx
страницы, созданной в руководстве По запросу данных с помощью элемента управления SqlDataSource , и дополним его, чтобы включить возможности удаления.
Начните с открытия InsertUpdateDelete.aspx
страниц и Querying.aspx
из SqlDataSource
папки . В Designer на Querying.aspx
странице выберите SqlDataSource и GridView из первого примера (ProductsDataSource
элементы управления и GridView1
). Выбрав два элемента управления, перейдите в меню Правка и выберите Копировать (или просто нажмите клавиши CTRL+C). Затем перейдите к Designer InsertUpdateDelete.aspx
и вставьте элементы управления. Переместив два элемента управления в InsertUpdateDelete.aspx
, проверьте страницу в браузере. Вы должны увидеть значения столбцов ProductID
, ProductName
и UnitPrice
для всех записей в Products
таблице базы данных.
Рис. 1. Все продукты перечислены, упорядочены по ProductID
(щелкните для просмотра полноразмерного изображения)
Добавление свойств DeleteCommand и DeleteParameters sqlDataSource
На этом этапе у нас есть SqlDataSource, который просто возвращает все записи из Products
таблицы, и GridView, который отображает эти данные. Наша цель — расширить этот пример, чтобы позволить пользователю удалять продукты с помощью GridView. Для этого необходимо указать значения для свойств и элементов управления DeleteCommand
SqlDataSource, DeleteParameters
а затем настроить GridView для поддержки удаления.
Свойства DeleteCommand
и DeleteParameters
можно указать несколькими способами:
- С помощью декларативного синтаксиса
- Из окно свойств в Designer
- На экране Укажите настраиваемую инструкцию SQL или хранимую процедуру в мастере настройки источника данных
- С помощью кнопки Дополнительно на экране Укажите столбцы из таблицы представления в мастере настройки источника данных, который фактически автоматически создаст инструкцию
DELETE
SQL и коллекцию параметров, используемые вDeleteCommand
свойствах иDeleteParameters
Мы рассмотрим, как автоматически создать инструкцию на шаге DELETE
2. Пока давайте используем окно свойств в Designer, хотя мастер настройки источника данных или декларативный синтаксис будут работать так же хорошо.
В Designer в InsertUpdateDelete.aspx
щелкните ProductsDataSource
SqlDataSource и откройте окно свойств (в меню Вид выберите окно свойств или просто нажмите клавишу F4). Выберите свойство DeleteQuery, чтобы открыть набор многоточий.
Рис. 2. Выбор свойства DeleteQuery в окне свойств
Примечание
SqlDataSource не имеет свойства DeleteQuery. Скорее, DeleteQuery представляет собой сочетание DeleteCommand
свойств и и DeleteParameters
отображается только в окно свойств при просмотре окна через Designer. Если вы просматриваете окно свойств в представлении Источник, вы найдете 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
(а не , скажем, ), так как имя столбца первичного ключа в таблице Products (и, следовательно, @ID
значение 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()
кнопка 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
По мере изучения INSERT
шага 1 инструкции SQL , UPDATE
и DELETE
можно указать с помощью окно свойств или декларативного синтаксиса элемента управления. Однако для этого подхода требуется вручную записать инструкции SQL вручную, что может быть однообразным и подверженным ошибкам. К счастью, мастер настройки источника данных предоставляет возможность автоматического INSERT
создания инструкций , UPDATE
и DELETE
при использовании экрана Указание столбцов из таблицы представления.
Рассмотрим этот вариант автоматического создания. Добавьте DetailsView в Designer в InsertUpdateDelete.aspx
и задайте для его ID
свойства значение ManageProducts
. Затем в смарт-теге DetailsView выберите создать источник данных и sqlDataSource с именем ManageProductsDataSource
.
Рис. 6. Создание нового объекта SqlDataSource с именем ManageProductsDataSource
(щелкните для просмотра полноразмерного изображения)
В мастере настройки источника данных выберите использование NORTHWINDConnectionString
строка подключения и нажмите кнопку Далее. На экране Настройка инструкции select оставьте переключателем Указать столбцы из таблицы или представления и выберите таблицу 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
, нажмите кнопку ОК, чтобы вернуться к экрану Configure Select Statement (Настройка инструкции), а затем нажмите кнопку Далее, а затем — Готово, чтобы завершить работу мастера настройки источника данных. После завершения работы мастера Visual Studio добавит BoundFields в DetailsView для ProductID
столбцов , ProductName
и UnitPrice
и CheckBoxField для столбца Discontinued
. В смарт-теге DetailsView проверка параметр Включить разбиение по страницам, чтобы пользователь, посещающий эту страницу, мог пошагово просматривать продукты. Также очистите свойства DetailsView Width
и Height
.
Обратите внимание, что смарт-тег имеет доступные параметры Включить вставку, Включить редактирование и Включить удаление. Это связано с тем, что 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
(по умолчанию), отображается в качестве элемента TextBox, а CheckBoxField — в качестве флажка.
Рис. 9. Интерфейс редактирования DetailsView по умолчанию (щелкните для просмотра полноразмерного изображения)
Аналогичным образом можно удалить выбранный в данный момент продукт или добавить новый продукт в систему. InsertCommand
Так как инструкция работает только со ProductName
столбцами , UnitPrice
и Discontinued
, остальные столбцы имеют NULL
значение или значение по умолчанию, присвоенное базой данных при вставке. Как и в Случае с ObjectDataSource, если InsertCommand
отсутствуют столбцы таблицы базы данных, которые не допускают NULL
s и не имеют значения по умолчанию, при попытке выполнения инструкции INSERT
возникнет ошибка SQL.
Примечание
Интерфейсы вставки и редактирования DetailsView не имеют какой-либо настройки или проверки. Чтобы добавить элементы управления проверки или настроить интерфейсы, необходимо преобразовать BoundFields в TemplateFields. Дополнительные сведения см. в руководствах Добавление элементов управления проверкой в интерфейсы редактирования и вставки и Настройка интерфейса изменения данных .
Кроме того, помните, что для обновления и удаления DetailsView использует текущее DataKey
значение продукта, которое присутствует только в том случае, если DataKeyNames
свойство настроено. Если редактирование или удаление не оказывает влияния, убедитесь, что DataKeyNames
свойство задано.
Ограничения автоматического создания инструкций SQL
Так как параметр Generate INSERT
, UPDATE
и DELETE
statements доступен только при выборе столбцов из таблицы, для более сложных запросов потребуется написать собственные INSERT
операторы , и DELETE
, UPDATE
как мы делали на шаге 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 это означает, что INSERT
инструкции , UPDATE
и DELETE
SQL должны быть назначены свойствам InsertCommand
, UpdateCommand
и DeleteCommand
. Эти свойства и соответствующие коллекции параметров можно добавить вручную или создать автоматически с помощью мастера настройки источника данных. В этом руководстве мы рассмотрели оба метода.
Мы рассмотрели использование оптимистичного параллелизма в ObjectDataSource в учебнике Реализация оптимистичного параллелизма . Элемент управления SqlDataSource также обеспечивает поддержку оптимистического параллелизма. Как указано в шаге 2, при автоматическом создании INSERT
инструкций , UPDATE
и DELETE
мастер предлагает параметр Использовать оптимистичный параллелизм. Как мы увидим в следующем руководстве, использование оптимистичного параллелизма с SqlDataSource изменяет WHERE
предложения в UPDATE
инструкциях и DELETE
, чтобы гарантировать, что значения для других столбцов не изменились с момента последнего отображения данных на странице.
Счастливое программирование!
Об авторе
Скотт Митчелл (Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с Веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часа. Его можно связать по адресу mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.