Поделиться через


Вставка, обновление и удаление данных с помощью элемента управления SqlDataSource (VB)

Скотт Митчелл

Загрузить PDF-файл

В предыдущих руководствах мы узнали, как элемент управления 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 необходимо задать два свойства:

  1. ConnectionString, который указывает, в какую базу данных отправляется запрос, и
  2. SelectCommand, задающий нерегламентированный SQL-инструкцию или имя хранимой процедуры, выполняемой для возврата результатов.

Для SelectCommand значений с параметрами значения параметров указываются с помощью коллекции SqlDataSource и могут включать жестко заданные значения, общие исходные значения параметров (поля строки запросов, переменные сеанса SelectParameters , значения веб-элементов управления и т. д.) или могут быть назначены программным способом. Когда метод элемента управления Select() SqlDataSource вызывается программным или автоматически из веб-элемента управления данными, устанавливается подключение к базе данных, значения параметров назначаются запросу, а команда отправляется в базу данных. Затем результаты возвращаются как DataSet или DataReader в зависимости от значения свойства элемента управления DataSourceMode .

Наряду с выбором данных элемент управления SqlDataSource можно использовать для вставки, обновления и удаления данных путем предоставления INSERTинструкций , UPDATEи DELETE SQL практически таким же образом. Просто назначьте InsertCommandсвойства , UpdateCommandи DeleteCommand инструкции INSERTSQL , 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 таблице базы данных.

Все продукты перечислены, упорядочены по ProductID

Рис. 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, чтобы открыть набор многоточий.

Снимок экрана: окно свойств ProductsDataSource с выбранным свойством DeleteQuery.

Рис. 2. Выбор свойства DeleteQuery в окне свойств

Примечание

SqlDataSource не имеет свойства DeleteQuery. Скорее, DeleteQuery представляет собой сочетание DeleteCommand свойств и и DeleteParameters отображается только в окно свойств при просмотре окна через Designer. Если вы просматриваете окно свойств в представлении Источник, вы найдете DeleteCommand свойство .

Щелкните многоточие в свойстве DeleteQuery, чтобы открыть диалоговое окно Команда и параметр Редактор (см. рис. 3). В этом диалоговом окне можно указать инструкцию DELETE SQL и указать параметры. Введите следующий запрос в текстовое DELETE поле команды (вручную или с помощью построителя запросов, если хотите):

DELETE FROM Products
WHERE ProductID = @ProductID

Затем нажмите кнопку Обновить параметры, чтобы добавить @ProductID параметр в список параметров ниже.

Снимок экрана: окно Редактор команд и параметров с параметром <span class=@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 со свойством ShowDeleteButtonTrue. Как показано на рисунке 4, при посещении страницы через браузер включается кнопка Удалить. Протестируйте эту страницу, удалив некоторые продукты.

Каждая строка GridView теперь включает кнопку

Рис. 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.

Создание нового объекта SqlDataSource с именем ManageProductsDataSource

Рис. 6. Создание нового объекта SqlDataSource с именем ManageProductsDataSource (щелкните для просмотра полноразмерного изображения)

В мастере настройки источника данных выберите использование NORTHWINDConnectionString строка подключения и нажмите кнопку Далее. На экране Настройка инструкции select оставьте переключателем Указать столбцы из таблицы или представления и выберите таблицу Products из раскрывающегося списка. В списке ProductIDфлажков выберите столбцы , ProductNameUnitPrice, и Discontinued .

Используя таблицу Products, верните столбцы ProductID, ProductName, UnitPrice и Неподдерживаемые.

Рис. 7. Использование Products таблицы возвращает ProductIDстолбцы , ProductName, UnitPriceи Discontinued (щелкните для просмотра полноразмерного изображения)

Чтобы автоматически создавать INSERTинструкции , UPDATEи DELETE на основе выбранных таблиц и столбцов, нажмите кнопку Дополнительно и проверка флажок Создать 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 содержит значения для , InsertCommandUpdateCommandи 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 — в качестве флажка.

Интерфейс редактирования DetailsView по умолчанию

Рис. 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.