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.DataImports 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 = TrueEnd 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