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


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

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

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

В предыдущих руководствах мы узнали, как элемент управления ObjectDataSource позволяет вставлять, обновлять и удалять данные. Элемент управления SqlDataSource поддерживает те же операции, но подход отличается, и в этом руководстве показано, как настроить SqlDataSource для вставки, обновления и удаления данных.

Введение

Как описано в статье Общие сведения о вставке, обновлении и удалении, элемент управления GridView предоставляет встроенные возможности обновления и удаления, а элементы управления DetailsView и FormView включают поддержку вставки, а также функции редактирования и удаления. Эти возможности изменения данных можно подключить непосредственно к элементу управления источником данных без необходимости написания строки кода. В статье Общие сведения о вставке, обновлении и удалении рассматривается использование ObjectDataSource для упрощения вставки, обновления и удаления с помощью элементов управления GridView, DetailsView и FormView. Кроме того, вместо ObjectDataSource можно использовать SqlDataSource.

Помните, что для поддержки вставки, обновления и удаления с помощью ObjectDataSource необходимо указать методы уровня объектов, которые необходимо вызвать для выполнения действия вставки, обновления или удаления. В SqlDataSource необходимо предоставить INSERTUPDATEинструкции SQL , и 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 инструкции , UPDATEи DELETE SQL можно указать с помощью окно свойств или декларативного синтаксиса элемента управления. Однако для этого подхода требуется вручную записать инструкции SQL вручную, что может быть монотонным и подверженным ошибкам. К счастью, мастер настройки источника данных предоставляет возможность автоматического INSERTсоздания инструкций , UPDATEи DELETE при использовании экрана Указание столбцов из таблицы представления.

Давайте рассмотрим этот вариант автоматического создания. Добавьте DetailsView в Designer в InsertUpdateDelete.aspx и задайте для его ID свойства значение ManageProducts. Затем в смарт-теге DetailsView выберите создание нового источника данных и sqlDataSource с именем ManageProductsDataSource.

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

Рис. 6. Создание sqlDataSource с именем ManageProductsDataSource (щелкните, чтобы просмотреть полноразмерное изображение)

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

С помощью таблицы Products возвращает столбцы ProductID, ProductName, UnitPrice и Discontinued.

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

Чтобы автоматически создавать INSERTинструкции , UPDATEи DELETE на основе выбранной таблицы и столбцов, нажмите кнопку Дополнительно и проверка флажок Создать INSERTинструкции , UPDATEи DELETE .

Установите флажок Создать инструкции INSERT, UPDATE и DELETE.

Рис. 8. Установите флажок Создать INSERTинструкции , UPDATEи DELETE

Флажок Создать INSERTинструкции , UPDATEи DELETE будет установлен, только если выбранная таблица содержит первичный ключ, а столбец первичного ключа (или столбцы) включен в список возвращаемых столбцов. Флажок Использовать оптимистичный параллелизм, который становится доступным для выбора после установки флажка Generate , , and statements (Создать INSERTоператоры , UPDATEи DELETE ), добавит WHERE предложения в результирующем UPDATE операторе и DELETE , чтобы обеспечить управление оптимистичным параллелизмом. Пока не устанавливайте этот флажок. Мы рассмотрим оптимистичный параллелизм с элементом управления SqlDataSource в следующем руководстве.

После установки флажка Создать INSERTинструкции , UPDATEи DELETE нажмите кнопку ОК, чтобы вернуться к экрану Настройка инструкции Выбор инструкции, затем нажмите кнопку Далее, а затем — Готово, чтобы завершить работу мастера настройки источника данных. После завершения работы мастера 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 — как флажок.

Интерфейс редактирования 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 инструкцию.

Еще одним ограничением автоматического создания инструкций , и DELETE является то, что столбцы в INSERT инструкциях и UPDATE основаны на столбцах, возвращаемых оператором SELECT . UPDATEINSERT Однако может потребоваться обновить или вставить больше или меньше полей. Например, в примере из шага 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.