Incluindo Constraints em um DataSet

 

O objeto DataSet da  ADO.NET permite uma representação em memória de um banco de dados , e , isto inclui : tabelas , chaves primárias , chave estrangeira , chave única , relacionamentos , etc.  Se você quer acessar um banco de dados e gerenciar dados e informações precisa saber realizar operações básicas relacionadas ao objeto DataSet.

 

Neste  artigo eu vou mostrar como podemos incluir constraints em objetos DataTable independente deles estarem no banco de dados atual ou não. Como exemplo usado neste artigo eu vou usar o banco de dados TesteNet.mdb e as tabelas : Produtos e Pedidos , conforme a estrutura abaixo:

 

Tabela Produtos Tabela Pedidos

 

As duas tabelas estão relacionadas pelo campo : CodigoProduto.

 

1- Criando uma chave primária em uma tabela

 

Neste código eu vou criar uma chave primária para o campo CodigoProduto da tabela Produtos.

 

1- Inicie um novo projeto Windows Application e no formulário padrão inclua um componente DataGrid e dois botões de comando conforme abaixo:

 

- Não esqueça de usar as declarações import abaixo:

Imports System.Data

Imports System.Data.OleDb

- Declare as variáveis objeto conexao , da e ds abaixo da declaração - windows form designer generate code

Dim conexao As OleDbConnection

Dim da As New OleDbDataAdapter()

Dim ds As New DataSet()

 

 

Código associado ao evento Click do botão - Cria chave Primária :

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 

'define a string de conexão com o banco de dados

Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TextBox1.Text

'define a instrução SQL que será usada para extrair as linhas da tabela Produtos

Dim sql As String = "Select * from Produtos"

'define o objeto OledbConnection usando a string de conexão e 'define a conexao e o objeto dataadapter

conexao = New OleDbConnection(strConn)

da = New OleDbDataAdapter(sql, strConn)

 

'preenche o dataset

da.Fill(ds, "Produtos")

'vamos incluir uma chave primaria na tabela produtos do nosso dataset e 'declaramos um vetor de um objeto DataColumn

Dim chavePrimaria(1) As DataColumn

 

'o campo codigoProduto vai atuar como chave primaira da tabela produtos

chavePrimaria(0) = ds.Tables(0).Columns("CodigoProduto")

 

'atribuimos a chave primaria a tabela produtos

ds.Tables("Produtos").PrimaryKey = chavePrimaria

 

'exibe os dados em um datagrid

DataGrid1.DataSource = ds

End Sub

 

Executando a aplicação teremos o resultado:

 

 

Para testar se a chave foi criada mesmo , vamos testar tentando incluir um valor duplicado para o campo CodigoProduto. Vamos tentar atribuir uma nova linha com o valor 1 para o campo  CodigoProduto. O código associado ao evento Click do botão - Incluir um valor duplicado  - é dado abaixo:

 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

 

Dim r As DataRow

r = ds.Tables("Produtos").NewRow

r.Item("codigoProduto") = "1"

r.Item("nomeProduto") = "Produto 1"

 

ds.Tables("Produtos").Rows.Add(r)

End Sub

 

Se a chave primária existir , como existe de fato , teremos um erro em tempo de execução. Veja o erro abaixo :

 

 

Pela mensagem de erro verificamos que a chave primária que criamos para o campo CodigoProduto realmente existe.

 

1- Criando uma chave estrangeira em uma DataSet

 

Podemos notar pela estrutura das tabelas Produtos e Pedidos (ver figura no inicio da página)  que os campos : CodigoProduto de ambas as tabelas estão relacionados. O campo CodigoProduto da tabela Produtos é chave primária , e o campo CodigoProduto da tabela Pedidos é chave estrangeira. Vamos mostrar como criar uma chave estrangeira em um DataSet via código.

 

A primeira coisa que precisamos fazer é carregar a tabela Pedidos em nosso DataSet já criado via código acima. Para isto acrescente o seguinte código a listagem:

 

'-------------carregando a tabela Pedidos no DataSet

da.SelectCommand.CommandText = "Select * from Pedidos"

da.Fill(ds, "Pedidos")

Após carregar a tabela Pedidos no DataSet teremos a visualização das mesmas em um DataGrid

 

Vamos agora criar a chave estrangeira para o campo - CodigoProduto - da tabela Pedidos. No evento click do botão - Cria Chave Estrangeira ( Button3):

 

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

 

Dim chave_estrangeira As ForeignKeyConstraint

'criando a chave estrangeira. Tables(0)= Produtos e Tables(1)=Pedidos

 

chave_estrangeira = New ForeignKeyConstraint("FK", ds.Tables(0).Columns("CodigoProduto"), ds.Tables(1).Columns("CodigoProduto"))

'definimos a atualização e a exclusção em cascata (jamais faça isto na prática)

With chave_estrangeira

   .DeleteRule = Rule.Cascade

   .UpdateRule = Rule.Cascade

End With

 

'incluimos as constraints a coleção Constraints de Table

ds.Tables(1).Constraints.Add(chave_estrangeira)

ds.EnforceConstraints = True

End Sub

 

Para testar se a coisa funciona é só tentar incluir um valor que viola a restrição imposta pela constraint. Vamos incluir  o código abaixo no evento Click do botão - Incluir um valor duplicado. Ao clicar iremos obter um erro indicando que a regra imposta pela chave estrangeira foi violada.

 

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

Dim r As DataRow

 

r = ds.Tables(1).NewRow

r.Item("CodigoPedido") = 1

r.Item("CodigoProduto") = 0

r.Item("ClienteID") = 1

r.Item("Quantidade") = 10

r.Item("ValorTotal") = 10.0

 

ds.Tables(1).Rows.Add(r)

 

End Sub

 

 

Finalmente para incluir uma restrição de chave única podemos usar o seguinte código :

 

Dim chave_unica As New Data.UniqueConstraint(ds.Tables(0).Columns(1))

ds.Tables(0).Constraints.Add(chave_unica)

 

O código acima cria uma chave única ( unique) para a coluna NomeProduto da tabela Produtos. Para testar basta tentar incluir um valor duplicado para este campo.

 

Até o próximo artigo VB.NET ..


José Carlos Macoratti