Copiar Dados de um DataTable para outro

Para fazer uma copia identica de um DataTable voce precisa utilizar o método Copy() do DataTable, se deseja apeas copiar  schema das tabelas sem os dados o metodo que deve ser utilizado é o Clone().

Apenas para exemplificar o uso.

DataTable dt = new DataTable();
dt.Columns.Add("Coluna1");
dt.Columns.Add("Coluna2");

DataRow dr = dt.NewRow();
dr["Coluna1"] = "Valor 1";
dr["Coluna2"] = "Valor 2";

DataTable dt2 = dt.Clone();// Aqui a linha não sera copiada, apenas as colunas

DataTable dt3 = dt.Copy();// Aqui o DataTable inteiro sera copiado

IMPORTANTE:

Apenas definir um novo objeto DataTable e igualar ao seu DataTable diretamente, apenas ocorrera uma copia de de referencia. Isso e um problema pois quando voce alterar um DataTable o outro tambem sera altera.

Exemplo:

DataTable dt = new DataTable();
 dt.Columns.Add("Coluna1");
 dt.Columns.Add("Coluna2");

DataRow dr = dt.NewRow();
 dr["Coluna1"] = "Valor 1";
 dr["Coluna2"] = "Valor 2";

// dessa forma ao invez de criar um novo objeto, a unica coisa que sera feita
 // sera colocar a mesma referencia a um objeto em outra variavel
 DataTable dt2 = dt;

 dt2.Rows.Clear(); // e quado altera como e o mesmo objeto as duas variaveis ficam iguais.
 int quantidadeLinhas = dt.Rows.Count; // isso ira retornar 0
Anúncios

Definir nomes aparentes diferente dos nomes das colunas de um DataTable

Como o titulo não está auto explicativo vou explicar o cenario que esse post se aplica.

Você tem um DataTable montado e voce quer deixar o titulo da coluna que irá aparecer para o usuário com um nome(“Nome do Usuário”), mas você quer deixar o nome da coluna do DataTable com o nome igual do banco de dados(“str_usuario”). Se você precisa fazer isso sem definir as colunas diretamente em um controle Asp.Net ou WinForms, então leia o post inteiro.

Em uma DataTable é necessário definir as colunas antes de começar a adicionar linhas nele, essas colunas são representadas por objetos DataColumn.

Um objeto DataColumn possui as propriedades ColumnName e Caption.

A propriedade ColumnName define o nome da coluna que será utilizada na codificação para acessar essa coluna, exemplo:


DataTable dt = new DataTable("Nome_Tabela");
 DataColumn dc = dt.Columns.Add();
 dc.ColumnName = "str_usuario";
 string nomeColuna = dc.Caption; //Aqui será retornado o str_usuario e se voce colocar esse DataTable em um Grid ocorrerá o mesmo
DataColumn dc1 = dt.Columns["str_usuario"];

A propriedade Caption define o nome que irá aparecer para no controle que você definir esse DataTable como DataSource, se não for definido nada, por padrão, essa propriedade retorna o valor da propriedade ColumnName, exemplo:


DataTable dt = new DataTable("Nome_Tabela");
 DataColumn dc = dt.Columns.Add();
 dc.ColumnName = "str_usuario";
 dc.Caption = "Nome do Usuário";
DataColumn dc1 = dt.Columns["str_usuario"];

Se voce colocar esse trecho de código em um sistema e definir esse DataTable em qualquer controle que aceita DataSource, voce irá reparar que o nome das colunas que irá aparecer no visual, será o Caption, e quando for necessário acessar a coluna em seu DataTable voce pode buscar pelo nome da coluna mesmo.

Adicionar coluna Indentity em um DataTable

Em um objeto datatable as vezes é necessário criar uma colunu Indentity ou auto-increment para simular uma coluna no banco de dados, para efetuar é necessário apenas tres propriedades da sua DataColumn:

  • AutoIncrement: propriedade booleana para definir se a coluna será ou não autoincrement.
  • AutoIncrementSeed: propriedade numérica para definir o número inicial do auto increment.
  • AutoIncrementStep: propriedade numérica para definir o número que será somado a cada nova linha
Exemplo:
DataTable dt = new DataTable();
DataColumn dc1 = dt.Columns.Add("Id", typeof (int));
dc1.AutoIncrement = true;
dc1.AutoIncrementSeed = 1;
dc1.AutoIncrementStep = 1;
O que esse código vai gerar um DataTable com uma coluna chamada Id que a cada adição de linha, essa coluna irá obter um novo numero gerado automaticamente.A primeira linha desse DataTable irá ter o valor 1 a segunda 2 e assim segue.
IMPORTANTE
O que isso pode gerar de problema para voce:
Digamos que voce tenha um DataTable da tabela carro do seu banco de dados
-O Banco de dados já possui um carro com id 4 e vc adicionou um carro e com a auto-numeração  do DataTable ele está com o id 4, quando for adicionar esse registro em seu DataTable irá ocorrer um erro.
O que é recomendado que faça:
Definir o Seed e o Step para -1 assim não existirá conflito pois o banco de dados não gera numero negativos
DataTable dt = new DataTable();
DataColumn dc1 = dt.Columns.Add("Id", typeof (int));
dc1.AutoIncrement = true;
dc1.AutoIncrementSeed = -1;
dc1.AutoIncrementStep = -1;

Iniciando com ADO.Net

ADO.NET são várias classes que expõe serviços de acesso à dados para o programador .NET. O ADO.NET fornece um rico conjunto de componentes para a criação de aplicações distribuídas e compartilhamento de dados. O ADO.NET é parte integrante do NET Framework,que dá acesso relacional ao XML e à aplicação de dados. ADO.NET suporta uma variedade de

A estrutura do ADO.NET é dois tipos de classes, as classes conectadas e as classes desconectadas.

Classes desconectadas: São classes que não são fortemente ligadas com a conexão com a base de dados, assim essas informações podem ser criadas de qualquer outra fonte de dado, exemplo: Arquivo Binario, Arquivo Xml ou informações geradas pelo codigo.Exemplos:DataTable e DataSet.

Classes conectadas: São classes que são fortemente ligadas a base de dados, exemplo são as classes de conexão, classes de comando, entre outras.Exemplos: SqlConnection, DBConnection, SqlCommand.