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: ImportsSystem.Data ImportsSystem.Data.OleDb - Declare as variáveis objeto conexao , da e ds abaixo da declaração - windows form designer generate codeDim 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 :
| PrivateSub 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 ProdutosDim 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 DataColumnDim 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 = dsEnd 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