ADO.NET - Copiando registros entre tabelas


Não temos um objeto Recordset no ADO.NET , o seu equivalente é o objeto Datatable; ele é o objeto usado quando desejamos realizar operações com registros. Um objeto DataTable representa uma tabela de dados em memória.

Para copiar registros entre tabelas diferentes podemos usar o método ImportRow() do objeto DataTable para copiar objetos DataRow de um DataTable para o outro.

Neste artigo eu vou mostrar 3 maneiras de fazer a copia de registros entre DataTable.

Um objeto DataTable pode armazenar mais ou menos 16.000.000 de linhas. Abaixo temos as propriedades usadas nestes são :

- Rows : representa uma coleção de objetos DataRow, também conhecida como DataRowCollection e representa as linhas da tabela (registros)

- Select : Retorna um array de objetos DataRow

- ImportRow - Copia objetos DataRow em um DataTable preservendo as propriedades de configuração e os valores originais

- DefaultView - retorna um objeto DataView para o DataTable.

O método ImportRow() requer que ambas as tabelas , a origem e a destino, tenham a mesma estrutura. O método clone utilizado cria uma tabela com estrutura idêntica.

Podemos também usar o método Copy do objeto DataTable para criar uma nova DataTable com a mesma estrutura e dados da original. A seguir um trecho de código que mostra isto:

Dim dtOrigem As DataTable = New DataTable ("Origem") 
...
da.Fill(dtOrigem) 
Dim dtDestino As DataTable = New DataTable ("Destino") 
dtDestino = dtOrigem.Copy()
...

Como exemplo vou usar o banco de dados Northwind.mdb (o nosso saco de pancadas) e copiar registros da tabela Orders.

Inicie um novo projeto no VS.NET e no formulário padrão insira os seguintes controles (conforme figura):

- O primeiro radioButton - copia as 3 primeiras linhas da tabela orders

- O segundo radioButton - Faz a seleção dos registros com OrderID < 10300

- O terceiro radioButton - Faz um filtro e seleciona os registros entre OrderID > 10300 e OrderID < 10400

Inclua os seguintes imports no início do formulário:

Imports System
Imports System.Data
Imports System.Data.Oledb

agora inclua as definições de variáveis no início da classe:

' nome da tabela
Private ORDERS_TABLE As String = "Orders"
' nome do campo
Private ORDERID_FIELD As String = "OrderID"
'string SQL para selecionar dados da tabela
Private ORDER_SELECT As String = "SELECT * FROM Orders"

No evento Click do botão de comando insira o código abaixo:

Private Sub btnCopiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopiar.Click
        Dim strConexao As String = System.Configuration.ConfigurationSettings.AppSettings("acessoBD")
        ' preenche a tabela origem com o esquema e os dados
        Dim da As New OleDbDataAdapter(ORDER_SELECT, strConexao)
        Dim dt As New DataTable(ORDERS_TABLE)

        Try
            da.FillSchema(dt, SchemaType.Source)
            da.Fill(dt)
        Catch ex As Exception
            MsgBox(ex.Message & vbCrLf & ex.StackTrace)
        End Try

        ' faz um clone do esquema para a tabela copia criando uma tabela com a mesma estrutura
        Dim dtCopia As DataTable = dt.Clone()
        If rdbrow.Checked Then
            ' usa o método ImportRow para importar as primeiras 3 linhas
            Dim i As Integer
            For i = 0 To n
                dtCopia.ImportRow(dt.Rows(i))
            Next i
        Else
            If rdbselect.Checked Then
                ' faz a copia usando o resultado de um comando SELECT
                Dim row As DataRow
                For Each row In dt.Select((ORDERID_FIELD & " <= 10300"))
                    dtCopia.ImportRow(row)
                Next row
            Else
                If rdbdataview.Checked Then
                    ' faz a copia usando o resultado de um dataview filtrado
                    Dim categoryView As DataView = dt.DefaultView
                    categoryView.RowFilter = ORDERID_FIELD & " >= 10300 AND " & ORDERID_FIELD & " < 10400"
                    Dim i As Integer
                    For i = 0 To categoryView.Count - 1
                        dtCopia.ImportRow(categoryView(i).Row)
                    Next i
                End If
            End If
        End If                    
        ' vincula a view default da tabela copia para o datagrid
        DataGrid1.DataSource = dtCopia.DefaultView
    End Sub

 

Na linha de código

 Dim strConexao As String = System.Configuration.ConfigurationSettings.AppSettings("acessoBD")

estou lendo a string de conexão do arquivo de configuração da aplicação. (Leia o artigo : Tratando arquivos de configuração para saber mais)

Para esta aplicação o arquivo de configuração tem o seguinte conteúdo:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
    <add key="acessoBD" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\teste\Northwind.mdb" />
</appSettings>
</configuration>

Abaixo a tela do resultado da execução para a segunda opção :

Até o próximo artigo VB.NET


José Carlos Macoratti