Atualizando um banco de dados via objeto DataSet
A esta altura você já deve estar sabendo que o objeto DataSet tem um papel muito importando no acesso a dados no .NET framework, através dele temos em memória objetos que podem gerenciar tabelas , visões e relacionamentos. Se você quer saber mais sobre o assunto leia os artigos abaixo :
Vou mostrar como usar um objeto DataSet com dados carregados de um banco de dados , modificar os dados e então enviar os dados de volta ao banco dados a fim de atualizar a fonte original de dados. Vamos arregaçar as mangas...
Nota: Você pode usar o objeto Command para inserir , atualizar e excluir dados no banco de dados diretamente.
- Abra o Visual Studio e crie um novo projeto Visual Basic ; template - Windows Application
- Faça referência no seu projeto aos namespaces : System , System.Data e System.Data.SqlClient usando a declaração Imports:
Imports System
Imports System.Data
Imports System.Data.SqlClient
primeiro vamos carregar o DataSet com dados de uma tabela de um banco de dados; você já deve ter desconfiado que vamos acessar uma base de dados SQL Server. (Estamos usando o namespace - System.Data.SqlClient ).
A string de conexão usada aponta para o banco de dados Teste no meu computador local . A estrutura da tabela com os dados é mostrada abaixo:
| 
 | - A 
    string de conexão com o banco de dados é a seguinte: strConexao = "server=(local);Trusted_Connection=yes;database=Teste" 
 | 
O código do projeto é dado abaixo :
| Private 
    Sub Form1_Load(ByVal 
    sender As System.Object,
    ByVal e 
    As System.EventArgs)
    Handles 
    MyBase.Load Dim strConexao As String strConexao = "server=(local);Trusted_Connection=yes;database=Teste"Dim objConexao As New SqlConnection(strConexao) Try objConexao.Open()Catch ex As Exception MsgBox(ex.GetBaseException)End Try ' Cria uma instância do objeto DataAdapter. Dim daClientes As New SqlDataAdapter("Select * From Clientes", objConexao) ' Cria uma instância de um DataSet, e retorna dados da tabela clientesDim dsTeste As New DataSet("Clientes") daClientes.FillSchema(dsTeste, SchemaType.Source, "Clientes") daClientes.Fill(dsTeste, "Clientes") '--inserindo o registro no DataSet---------------------------------------------------------- MsgBox("Agora vou inserir um registro no DataSet", MsgBoxStyle.Information, "Inserir Registro")Dim tblClientes As DataTable tblClientes = dsTeste.Tables("Clientes")' Obtem um novo objeto DataRow do DataTable Dim drAtual As DataRow drAtual = tblClientes.NewRow() '' Define os novos valores de DataRow drAtual("Codigo") = 7 drAtual("Nome") = "Testolina Testa" drAtual("Endereco") = "Rua Moscou , 109"' Insere o novo objeto via método Add da coleção DataTable.Rows tblClientes.Rows.Add(drAtual) MsgBox("Registro incluído com sucesso na tabela Clientes.", MsgBoxStyle.Information, "Incluindo dados no DataSet") '---------codigo para alterar os dados inseridos ---------------------------------------------- MsgBox("Vou alterar o atual no DataSet", MsgBoxStyle.Information, "Alterar Registro") drAtual.BeginEdit() drAtual("nome") = "Yuri Gagarin" drAtual("endereco") = "R Lua Nova , 230" drAtual.EndEdit() MsgBox("Registro alterado com sucesso !", MsgBoxStyle.Information, "Alterando dados no DataSet") '-----------atualiza a tabela clientes do banco de dados Teste no SQL Server'Atualiza o SQL Server Dim objCommandBuilder As New SqlCommandBuilder(daClientes) daClientes.Update(dsTeste, "Clientes") MsgBox("A operações feitas no DataSet irão atualizar o SQL Server !" & Chr(13) & Chr(13) & " Verifique os dados no Servidor", MsgBoxStyle.Exclamation, "Atualização SQL Server") 'exibe os dados do DataSet DataGrid1.DataSource = dsTeste End Sub End Class 
 | 
Vamos explicar o código com mais detalhes:
| Dim strConexao As String strConexao = "server=(local);Trusted_Connection=yes;database=Teste"Dim objConexao As New SqlConnection(strConexao) Try objConexao.Open()Catch ex As Exception MsgBox(ex.GetBaseException)End Try | - define a string de conexão e cria uma conexão com o banco de dados Teste no SQL Server | 
| Dim dsTeste 
    As 
    New 
    DataSet("Clientes") daClientes.FillSchema(dsTeste, SchemaType.Source, "Clientes") daClientes.Fill(dsTeste, "Clientes") | - Cria uma instância de um DataSet, e retorna dados da tabela clientes do banco de dados Teste | 
| Dim tblClientes 
    As 
    DataTable tblClientes = dsTeste.Tables("Clientes")' Obtem um novo objeto DataRow do DataTable Dim drAtual As DataRow drAtual = tblClientes.NewRow() '' Define os novos valores de DataRow drAtual("Codigo") = 6 drAtual("Nome") = "Testolina Testa" drAtual("Endereco") = "Rua Moscou , 109"' Insere o novo objeto via método Add da coleção DataTable.Rows tblClientes.Rows.Add(drAtual) | - Definimos 
    um objeto DataTable - Obtemos um objeto DataRow do Datatable - Criamos uma nova linha e atribuímos os novos valores aos campos da tabela - A nova linha é incluída via método Add na tabela | 
| drAtual.BeginEdit() drAtual("nome") = "Yuri Gagarin" drAtual("endereco") = "R Lua Nova , 230" drAtual.EndEdit() | - Efetuamos a alteração do registro atual atribuindo novos valores para ele. | 
| Dim objCommandBuilder
    As 
    New 
    SqlCommandBuilder(daClientes) daClientes.Update(dsTeste, "Clientes") MsgBox("A operações feitas no DataSet irão atualizar o SQL Server !" & Chr(13) & Chr(13) & " Verifique os dados no Servidor", MsgBoxStyle.Exclamation, "Atualização SQL Server") | - Criamos o objeto objCommandBuilder e usando o método Update enviamos os dados para serem alterados no servidor. | 
| 'exibe os dados do DataSet DataGrid1.DataSource = dsTeste | - exibe os dados do DataSet no DataGrid. | 
Para atualizar o banco de dados original com todas as alterações passamos o DataSet via método Update do objeto DataAdapter. Antes de fazer isto é preciso definir as propriedades InsertCommand, UpdateCommand, e DeleteCommand do objeto DataAdapter. Você pode fazer isto manualmente escrevendo código SQL para definir estas propriedades ou podemos fazer com que o VS.NET faça isto para você automaticamente.
Para gerar os comandos requeridos precisamos criar uma instância do objeto SqlCommandBuilder e usar o objeto DataAdapter no construtor. Foi o que fizemos no código acima. Para que isto seja possível você precisa ter a informações disponíveis sobre a chave primária da tabela. Para obter estas informações usamos método FillSchema e definimos a propriedade MissingSchemaAction do DataAdapter para AddWithKey.
No exemplo acima abrimos uma tabela de um banco de dados no SQL Server , incluimos um novo registro e a seguir alteramos o registro inserido. Se você encerrar a aplicação neste ponto e abrir a tabela no SQL Server vai perceber que nada nela mudou, é por isto que usamos o método Update para atualizar os dados no banco de dados original.
No final exibimos os dados em um DataGrid , estes dados já refletem a atualização no banco de dados do Servidor
 .
.
Esta é apenas uma das maneiras de atualizar os 
dados usando o objeto DataSet .  Até o próximo artigo VB .NET ... 
José Carlos Macoratti