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


Вставка, обновление и удаление данных с SqlDataSource (VB)

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

Скачать в формате PDF

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

  1. ConnectionString, определяющий, в какую базу данных нужно отправить запрос, и
  2. 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.

Список всех продуктов, упорядоченных по ProductID

Рис. 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 параметр в список параметров ниже.

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

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

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

Создать новый SqlDataSource с именем ManageProductsDataSource

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

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

Используйте таблицу 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 в качестве флажка.

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

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