Compartilhar via


Inserir, atualizar e excluir dados com o SqlDataSource (VB)

por Scott Mitchell

Baixar PDF

Nos tutoriais anteriores, aprendemos como o controle ObjectDataSource permitia a inserção, atualização e exclusão de dados. O controle SqlDataSource dá suporte às mesmas operações, mas a abordagem é diferente, e este tutorial mostra como configurar o SqlDataSource para inserir, atualizar e excluir dados.

Introdução

Conforme discutido em uma visão geral da inserção, atualização e exclusão, o controle GridView fornece recursos internos de atualização e exclusão, enquanto os controles DetailsView e FormView incluem inserir suporte, juntamente com a edição e exclusão de funcionalidades. Esses recursos de modificação de dados podem ser conectados diretamente a um controle de fonte de dados sem que uma linha de código precise ser gravada. Uma visão geral da inserção, atualização e exclusão examinada usando o ObjectDataSource para facilitar a inserção, atualização e exclusão com os controles GridView, DetailsView e FormView. Como alternativa, o SqlDataSource pode ser usado no lugar do ObjectDataSource.

Lembre-se de que, para dar suporte à inserção, atualização e exclusão, com o ObjectDataSource, precisamos especificar os métodos de camada de objeto a serem invocados para executar a ação de inserção, atualização ou exclusão. Com o SqlDataSource, precisamos fornecer INSERT, UPDATE e DELETE instruções SQL (ou procedimentos armazenados) para execução. Como veremos neste tutorial, essas instruções podem ser criadas manualmente ou podem ser geradas automaticamente pelo assistente configurar fonte de dados do SqlDataSource.

Observação

Como já discutimos os recursos de inserção, edição e exclusão dos controles GridView, DetailsView e FormView, este tutorial se concentrará em configurar o controle SqlDataSource para dar suporte a essas operações. Se você precisar aprimorar a implementação desses recursos no GridView, DetailsView e FormView, retorne aos tutoriais editando, inserindo e excluindo dados, começando com uma visão geral de inserção, atualização e exclusão.

Etapa 1: Especificando instruções INSERT, UPDATE e DELETE

Como vimos nos últimos dois tutoriais, para recuperar dados de um controle SqlDataSource, precisamos definir duas propriedades:

  1. ConnectionString, que especifica para qual banco de dados enviar a consulta e
  2. SelectCommand, que especifica a instrução SQL ad hoc ou o nome do procedimento armazenado a ser executado para retornar os resultados.

Para SelectCommand valores com parâmetros, os valores de parâmetro são especificados por meio da coleção SelectParameters do SqlDataSource e podem incluir valores fixos, valores de origem de parâmetro comuns (campos de cadeia de consulta, variáveis de sessão, valores de controle da Web e assim por diante) ou podem ser atribuídos programaticamente. Quando o método do controle SqlDataSource é invocado programaticamente ou automaticamente de um controle Web de dados, os valores de parâmetro são atribuídos à consulta, uma conexão com o banco de dados é estabelecida, e o comando é enviado para o banco de dados. Em seguida, os resultados são retornados como um DataSet ou DataReader, dependendo do valor da propriedade do DataSourceMode controle.

Juntamente com a seleção de dados, o controle SqlDataSource pode ser usado para inserir, atualizar e excluir dados fornecendo INSERT, UPDATEe DELETE instruções SQL da mesma maneira. Basta atribuir as propriedades InsertCommand, UpdateCommand e DeleteCommand às instruções SQL INSERT, UPDATE e DELETE para serem executadas. Se as instruções tiverem parâmetros (como quase sempre terão), inclua-os nas coleções InsertParameters, UpdateParameters, e DeleteParameters.

Depois que um valor de InsertCommand, UpdateCommand ou DeleteCommand for especificado, a opção para Habilitar Inserção, Edição ou Exclusão na marca inteligente do controle de dados Web correspondente ficará disponível. Para ilustrar isso, vamos usar um exemplo da página Querying.aspx que criamos no tutorial Consultando Dados com o controle SqlDataSource e ampliá-las para incluir recursos de exclusão.

Comece abrindo as páginas InsertUpdateDelete.aspx e Querying.aspx da pasta SqlDataSource. No Designer na Querying.aspx página, selecione SqlDataSource e GridView do primeiro exemplo (os controles ProductsDataSource e GridView1). Depois de selecionar os dois controles, vá para o menu Editar e escolha Copiar (ou basta clicar em Ctrl+C). Em seguida, vá até o Designer de InsertUpdateDelete.aspx e cole os controles. Depois de mover os dois controles para InsertUpdateDelete.aspx, teste a página em um navegador. Você deve ver os valores das colunas ProductID, ProductName, e UnitPrice para todos os registros na tabela do banco de dados Products.

Todos os produtos são listados, ordenados por ProductID

Figura 1: Todos os produtos são listados, ordenados por ProductID (Clique para exibir a imagem em tamanho real)

Adicionando as propriedades DeleteCommand e DeleteParameters do SqlDataSource

Neste ponto, temos um SqlDataSource que simplesmente retorna todos os registros da Products tabela e um GridView que renderiza esses dados. Nossa meta é estender este exemplo para permitir que o usuário exclua produtos por meio do GridView. Para fazer isso, precisamos especificar valores para os controles e propriedades sqlDataSource DeleteCommand e DeleteParameters , em seguida, configurar o GridView para dar suporte à exclusão.

As DeleteCommand propriedades e as DeleteParameters propriedades podem ser especificadas de várias maneiras:

  • Por meio da sintaxe declarativa
  • Na janela Propriedades do Designer
  • Na tela "Especifique uma instrução SQL personalizada ou procedimento armazenado" do assistente "Configurar Fonte de Dados"
  • Por meio do botão Avançado na tela de especificação de colunas de uma exibição de tabela no assistente Configurar Fonte de Dados, que gerará automaticamente a instrução SQL DELETE e a coleção de parâmetros usados nas propriedades DeleteCommand e DeleteParameters.

Examinaremos como criar automaticamente a DELETE instrução na Etapa 2. Por enquanto, vamos usar a janela Propriedades no Designer, embora a opção Configurar Fonte de Dados ou sintaxe declarativa funcione da mesma forma.

No Designer em InsertUpdateDelete.aspx, clique em ProductsDataSource SqlDataSource e abra a janela Propriedades (no menu Exibir, escolha a janela Propriedades ou simplesmente clique em F4). Selecione a propriedade DeleteQuery, que apresentará um conjunto de reticências.

Captura de tela mostrando a janela Propriedades ProductsDataSource com a propriedade DeleteQuery selecionada.

Figura 2: Selecione a propriedade DeleteQuery na janela Propriedades

Observação

O SqlDataSource não tem uma propriedade DeleteQuery. Na verdade, DeleteQuery é uma combinação das propriedades DeleteCommand e DeleteParameters e só é listado na janela de Propriedades quando vista através do Designer. Se você estiver examinando a janela Propriedades no modo de exibição Origem, encontrará a DeleteCommand propriedade em vez disso.

Clique nos três pontos da propriedade DeleteQuery para abrir a caixa de diálogo do Editor de Comandos e Parâmetros (consulte a Figura 3). Nessa caixa de diálogo, você pode especificar a DELETE instrução SQL e especificar os parâmetros. Insira a seguinte consulta na caixa de texto de DELETE comando (manualmente ou usando o Construtor de Consultas, se preferir):

DELETE FROM Products
WHERE ProductID = @ProductID

Em seguida, clique no botão Atualizar Parâmetros para adicionar o @ProductID parâmetro à lista de parâmetros abaixo.

Captura de tela mostrando a janela Editor de Comandos e Parâmetros com o parâmetro <span class= @ProductID adicionado à lista de parâmetros de comando DELETE.". />

Figura 3: Selecione a propriedade DeleteQuery na janela Propriedades (Clique para exibir a imagem em tamanho real)

Não forneça um valor para esse parâmetro (mantenha a origem do parâmetro em Nenhum). Depois de adicionarmos o suporte de exclusão ao GridView, o GridView fornecerá automaticamente esse valor de parâmetro, usando o valor de sua DataKeys coleção para a linha cujo botão Excluir foi clicado.

Observação

O nome do DELETE parâmetro usado na consulta deve ser o mesmo que o nome do DataKeyNames valor em GridView, DetailsView ou FormView. Ou seja, o parâmetro na DELETE instrução é nomeado @ProductID propositalmente (em vez de, digamos, @ID), porque o nome da coluna de chave primária na tabela Produtos (e, portanto, o valor DataKeyNames no GridView) é ProductID.

Se o nome e DataKeyNames o valor do parâmetro não corresponderem, o GridView não poderá atribuir automaticamente ao parâmetro o valor da DataKeys coleção.

Depois de inserir as informações relacionadas à exclusão na caixa de diálogo Editor de Comandos e Parâmetros, clique em OK e vá para o modo de exibição Origem para examinar a marcação declarativa resultante:

<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>

Observe a adição da DeleteCommand propriedade, bem como a <DeleteParameters> seção e o objeto Parameter chamado productID.

Configurando o GridView para exclusão

Com a propriedade DeleteCommand adicionada, a tag inteligente do GridView agora contém a opção Ativar Exclusão. Vá em frente e marque esta caixa de seleção. Conforme discutido em uma visão geral de inserção, atualização e exclusão, isso faz com que o GridView adicione um CommandField com sua ShowDeleteButton propriedade definida como True. Como mostra a Figura 4, quando a página é visitada por meio de um navegador, um botão Excluir é incluído. Teste esta página excluindo alguns produtos.

Cada linha GridView agora inclui um botão Excluir

Figura 4: cada linha do GridView agora inclui um botão de exclusão (Clique aqui para exibir a imagem completa, em tamanho real)

Ao clicar em um botão Excluir, ocorre um postback, o GridView atribui ao parâmetro ProductID o valor da coleção DataKeys para a linha cujo botão Excluir foi clicado e invoca o método Delete() do SqlDataSource. O controle SqlDataSource conecta-se ao banco de dados e executa a DELETE instrução. Em seguida, o GridView se reconecta ao SqlDataSource para retornar e exibir o conjunto de produtos atual (que já não inclui o registro recém-excluído).

Observação

Como o GridView usa sua DataKeys coleção para preencher os parâmetros SqlDataSource, é vital que a propriedade do GridView DataKeyNames seja definida para as colunas que constituem a chave primária e que o SqlDataSource retorne SelectCommand essas colunas. Além disso, é importante que o nome do parâmetro no SqlDataSource s DeleteCommand esteja definido como @ProductID. Se a DataKeyNames propriedade não estiver definida ou o parâmetro não for nomeado @ProductsID, clicar no botão Excluir causará um postback, mas não excluirá nenhum registro.

A Figura 5 ilustra essa interação graficamente. Consulte o tutorial Examinando os eventos associados à inserção, atualização e exclusão para uma discussão mais detalhada sobre a cadeia de eventos associada à inserção, atualização e exclusão de um controle da Web de dados.

Clicar no botão Excluir no GridView invoca o método Delete() do SqlDataSource

Figura 5: Clicar no botão Excluir no GridView invoca o método SqlDataSource Delete()

Etapa 2: Gerar automaticamente as instruções INSERT, UPDATE e DELETE

Como a Etapa 1 examinou, INSERT, UPDATE e as instruções SQL DELETE podem ser especificadas por meio da janela Propriedades ou da sintaxe declarativa do controle. No entanto, essa abordagem requer que escrevamos manualmente as instruções SQL manualmente, que podem ser monótonas e propensas a erros. Felizmente, o assistente Configurar Fonte de Dados fornece uma opção para ter as instruções INSERT, UPDATE e DELETE geradas automaticamente ao usar a tela Especificar colunas de uma tabela ou exibição.

Vamos explorar essa opção de geração automática. Adicione um DetailsView no Designer InsertUpdateDelete.aspx e configure a propriedade ID para ManageProducts. Em seguida, na tag inteligente DetailsView, escolha criar uma nova fonte de dados e criar um SqlDataSource nomeado ManageProductsDataSource.

Criar um novo SqlDataSource chamado ManageProductsDataSource

Figura 6: Criar um Novo SqlDataSource Nomeado ManageProductsDataSource (Clique para exibir imagem em tamanho real)

No assistente Configurar Fonte de Dados, opte por usar a NORTHWINDConnectionString cadeia de conexão e clique em Avançar. Na tela Configurar a Instrução Selecionar, deixe o botão de opção Especificar colunas de uma tabela ou exibir selecionado e escolha a tabela Products na lista suspensa. Selecione as colunas ProductID, ProductName, UnitPrice e Discontinued da lista de caixas de seleção.

Usando a tabela de produtos, retorne as colunas ProductID, ProductName, UnitPrice e Descontinuadas

Figura 7: Usando a Products Tabela, retorne as ProductID colunas, ProductName, UnitPrice, e Discontinued. Clique para ver a imagem em tamanho real

Para gerar automaticamente instruções INSERT, UPDATE e DELETE com base na tabela e nas colunas selecionadas, clique no botão Avançado e marque a caixa de seleção Gerar instruções INSERT, UPDATE e DELETE.

Marque a caixa de seleção para gerar instruções INSERT, UPDATE e DELETE

Figura 8: Marque a caixa de seleção das instruções Gerar INSERT, UPDATE e DELETE

A caixa de seleção Gerar INSERT, UPDATE, e DELETE instruções só poderá ser marcada se a tabela selecionada tiver uma chave primária e a coluna de chave primária (ou colunas) estiver incluída na lista de colunas retornadas. A caixa de seleção Usar simultaneidade otimista, que se torna selecionável depois que a caixa de seleção Gerar INSERT, UPDATE e DELETE declarações tiver sido marcada, aumentará as cláusulas WHERE nas instruções UPDATE e DELETE resultantes para fornecer controle de simultaneidade otimista. Por enquanto, deixe esta caixa de seleção desmarcada; examinaremos a simultaneidade otimista com o controle SqlDataSource no próximo tutorial.

Depois de verificar a caixa de seleção Gerar INSERT, UPDATEe DELETE instruções, clique em OK para retornar à tela Configurar Instrução Selecionar, em seguida, clique em Avançar e, em seguida, Concluir, para concluir o assistente Configurar Fonte de Dados. Ao concluir o assistente, o Visual Studio adicionará BoundFields ao DetailsView para as colunas ProductID, ProductName e UnitPrice e um CheckBoxField para a coluna Discontinued. Na etiqueta DetailsView, selecione a opção Habilitar Paginação para que o usuário que estiver visitando esta página possa percorrer os produtos. Limpe também as propriedades Width e Height do DetailsView.

Observe que a tag inteligente tem as opções Habilitar Inserção, Habilitar Edição e Habilitar Exclusão disponíveis. Isso ocorre porque o SqlDataSource contém valores para suas InsertCommand, UpdateCommand e DeleteCommand, conforme mostra a sintaxe declarativa a seguir.

<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>

Observe como o controle SqlDataSource teve valores definidos automaticamente para suas propriedades InsertCommand, UpdateCommand e DeleteCommand. O conjunto de colunas referenciadas nas propriedades InsertCommand e UpdateCommand são baseadas naquelas na instrução SELECT. Ou seja, em vez de ter todas as colunas Products no InsertCommand e UpdateCommand, há apenas essas colunas especificadas no SelectCommand (menos ProductID, que é omitido porque é uma IDENTITY coluna, cujo valor não pode ser alterado quando editado e que é atribuído automaticamente ao inserir). Além disso, para cada parâmetro no InsertCommand, UpdateCommande DeleteCommand propriedades, há parâmetros correspondentes no InsertParameters, UpdateParameterse DeleteParameters coleções.

Para ativar os recursos de modificação de dados do DetailsView, marque as opções Habilitar Inserção, Habilitar Edição e Habilitar Exclusão em seu smart tag. Isso adiciona um CommandField com seu ShowInsertButton, ShowEditButtone ShowDeleteButton propriedades definidas como True.

Visite a página em um navegador e anote os botões Editar, Excluir e Novo incluídos no DetailsView. Clicar no botão Editar coloca o DetailsView em modo de edição, exibindo cada BoundField cuja propriedade ReadOnly está definida como False (o padrão) como uma Caixa de Texto e o CheckBoxField como uma caixa de seleção.

A interface de edição padrão do DetailsView

Figura 9: A Interface de Edição Padrão do DetailsView (Clique para exibir a imagem em tamanho real)

Da mesma forma, você pode excluir o produto selecionado no momento ou adicionar um novo produto ao sistema. Como a instrução InsertCommand funciona apenas com as colunas ProductName, UnitPrice e Discontinued, as outras colunas têm NULL ou seu valor padrão atribuído pelo banco de dados após a inserção. Assim como acontece com o ObjectDataSource, se InsertCommand estiver faltando colunas na tabela do banco de dados que não aceitam NULL e não têm um valor padrão, ocorrerá um erro SQL ao tentar executar INSERT instrução.

Observação

As interfaces de inserção e edição do DetailsView não têm qualquer tipo de personalização ou validação. Para adicionar controles de validação ou personalizar as interfaces, você precisa converter os BoundFields em TemplateFields. Consulte a adição de controles de validação às interfaces de edição e inserção e personalização dos tutoriais da Interface de Modificação de Dados para obter mais informações.

Além disso, tenha em mente que, para atualizar e excluir, o DetailsView usa o valor atual do DataKey produto, que só estará presente se a DataKeyNames propriedade estiver configurada. Se a edição ou exclusão parecer não ter efeito, verifique se a DataKeyNames propriedade está definida.

Limitações da geração automática de instruções SQL

Como a opção Gerar INSERT, UPDATE e DELETE instruções só está disponível ao escolher colunas de uma tabela, para consultas mais complexas, você terá que escrever suas próprias INSERT, UPDATE e DELETE instruções, como fizemos na Etapa 1. Normalmente, as instruções SQL SELECT usam JOIN s para trazer dados de uma ou mais tabelas de pesquisa para fins de exibição (como trazer de volta o Categories campo da tabela ao exibir informações do CategoryName produto). Ao mesmo tempo, convém permitir que o usuário edite, atualize ou insira dados na tabela principal (Productsnesse caso).

Embora os comandos INSERT, UPDATE e DELETE possam ser inseridos manualmente, considere a seguinte dica de economia de tempo. Inicialmente, configure o SqlDataSource para que ele puxe dados apenas da tabela Products. Use o assistente Configurar Fonte de Dados na tela Especificar colunas de uma tabela ou exibição para que você possa gerar automaticamente as instruções INSERT, UPDATE, e DELETE. Depois de concluir o assistente, escolha configurar o SelectQuery na janela Propriedades (ou, como alternativa, volte para o assistente Configurar Fonte de Dados, mas use a opção Especificar uma instrução SQL personalizada ou procedimento armazenado). Em seguida, atualize a instrução SELECT para que inclua a sintaxe JOIN. Essa técnica oferece os benefícios de economia de tempo das instruções SQL geradas automaticamente e permite uma instrução mais personalizada SELECT .

Outra limitação de gerar automaticamente as instruções INSERT, UPDATE e DELETE é que as colunas nas instruções INSERT e UPDATE são baseadas nas colunas retornadas pela instrução SELECT. No entanto, talvez seja necessário atualizar ou inserir mais ou menos campos. Por exemplo, no exemplo da Etapa 2, talvez queiramos que o UnitPrice BoundField seja somente leitura. Nesse caso, ele não deve aparecer no UpdateCommand. Ou talvez queiramos definir o valor de um campo de tabela que não aparece no GridView. Por exemplo, ao adicionar um novo registro, talvez queiramos que o QuantityPerUnit valor seja definido como TODO.

Se essas personalizações forem necessárias, você precisará torná-las manualmente, por meio da janela Propriedades, da opção Especificar uma instrução SQL personalizada ou de procedimento armazenado no assistente ou por meio da sintaxe declarativa.

Observação

Ao adicionar parâmetros que não têm campos correspondentes no controle da Web de dados, tenha em mente que esses valores de parâmetros precisarão ser atribuídos valores de alguma maneira. Esses valores podem ser: codificados diretamente no InsertCommand ou UpdateCommand; podem vir de alguma origem predefinida (a querystring, o estado da sessão, os controles da Web na página e assim por diante); ou podem ser atribuídos programaticamente, como vimos no tutorial anterior.

Resumo

Para que os controles da Web de dados utilizem seus recursos internos de inserção, edição e exclusão, o controle da fonte de dados ao qual eles estão associados deve oferecer essa funcionalidade. Para o SqlDataSource, isso significa que as instruções SQL INSERT, UPDATE e DELETE devem ser atribuídas às propriedades InsertCommand, UpdateCommand e DeleteCommand. Essas propriedades e as coleções de parâmetros correspondentes podem ser adicionadas manualmente ou geradas automaticamente por meio do assistente Configurar Fonte de Dados. Neste tutorial, examinamos ambas as técnicas.

Examinamos o uso da simultaneidade otimista com o ObjectDataSource no tutorial implementando simultaneidade otimista . O controle SqlDataSource também fornece suporte de simultaneidade otimista. Conforme observado na Etapa 2, ao gerar automaticamente as instruções INSERT, UPDATE e DELETE, o assistente oferece a opção de usar concorrência otimista. Como veremos no próximo tutorial, utilizar a concorrência otimista com o SqlDataSource modifica as cláusulas das instruções WHERE, UPDATE e DELETE para garantir que os valores das outras colunas não tenham sido alterados desde que os dados foram exibidos pela última vez na página.

Divirta-se programando!

Sobre o autor

Scott Mitchell, autor de sete livros asp/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Microsoft Web desde 1998. Scott trabalha como consultor independente, treinador e escritor. Seu último livro é Sams Teach Yourself ASP.NET 2.0 em 24 Horas. Ele pode ser alcançado em mitchell@4GuysFromRolla.com.