Maneira simples de converter matriz datarow em tabela de dados

98

Quero converter um DataRowarray em DataTable... Qual é a maneira mais simples de fazer isso?

Developer404
fonte

Respostas:

91

Por que não iterar por meio de sua matriz DataRow e adicionar (usando DataRow.ImportRow, se necessário, para obter uma cópia da DataRow), algo como:

foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

Certifique-se de que sua dataTable tenha o mesmo esquema que a DataRows em sua matriz DataRow.

Jay Riggs
fonte
1
Essa técnica é útil se você receber a mensagem de erro "Uma fonte de dados inválida está sendo usada para MyControl. Uma fonte de dados válida deve implementar IListSource ou IEnumerable" ao tentar vincular um DataRow diretamente à propriedade DataSource de um controle. Veja como fazer:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads
+1 Eu prefiro isso em vez de rowArray.CopyToDataTable();porque isso mantém o esquema da tabela e não o está substituindo por um novo objeto de tabela!
Mojtaba Rezaeian
7
Muito bom ! Mas eu sugeriria clonar o DataTable antes do foreach. Ele copia o formato da DataTable: newDataTable = oldDataTable.clone ();
Whiplash
2
Dica: sua tabela de dados deve ter colunas criadas ou não será preenchida corretamente.
logixologista
192

Para .Net Framework 3.5+

DataTable dt = new DataTable();
DataRow[] dr = dt.Select("Your string");
DataTable dt1 = dr.CopyToDataTable();

Mas se não houver linhas na matriz, isso pode causar erros como A fonte não contém DataRows . Portanto, se você decidir usar este método CopyToDataTable(), deve verificar o array para saber se ele tem datarows ou não.

if (dr.Length > 0)
    DataTable dt1 = dr.CopyToDataTable();

Referência disponível no MSDN: Método DataTableExtensions.CopyToDataTable (IEnumerable)

joe
fonte
1
De onde você tirou copyToDataTable()? Não o encontrei em .net 2.0
SMUsamaShah
11
Isso deve ser marcado como uma resposta certa, pois o copyToDataTable()método cria uma cópia perfeita das colunas das linhas selecionadas, enquanto o datatable.ImportRow(row)método não
Dante
5
este método não é bom se a tabela já tiver linhas, pois substitui tudo o que já está lá. Se a mesa estiver vazia para começar, tudo bem.
Franck de
5
Prefiro esse método, desde que as funções .Net sejam otimizadas. Não se esqueça de adicionar a referência a System.Data.DataSetExtensions em seu projeto para que você não fique frustrado se perguntando por que esse método está faltando (como eu)
Broken_Window
Lembre-se de adicionar System.Data.DataSetExtensions Assembly nas Referências
Vagner Gon
12
DataTable dt = new DataTable(); 

DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");

dt.Rows.Add(dr);
Trigo mitch
fonte
2
Já tentei assim .. Ocorre um erro algo como "A matriz de entrada é maior que o número de colunas desta tabela."
Desenvolvedor404
Como Jay apontou, certifique-se de que sua dataTable tenha o mesmo esquema que DataRows em sua matriz DataRow
Mitch Wheat
1
Sim .. eu tentei. Usei Datatable1 = datatable2.Clone (); Agora está funcionando ... Obrigado :-)
Desenvolvedor404
Eu tentei isso com uma matriz de linha e não funcionou. Para cada linha na matriz de linhas, criei uma nova linha, copiei a propriedade ItemArray da linha original e a adição funcionou.
Steve
1
Isso não parece funcionar no .NET Framework 4.0 com o exemplo postado, nem com "dt" sendo clonado de dstata.tables [0]. A resposta de @joe acabou funcionando para meus propósitos. Erro de versão sem clone: ​​" Input array is longer than the number of columns in this table.". Erro de versão com clone: ​​" Unable to cast object of type 'System.Data.DataRow' to type 'System.IConvertible'.Couldn't store <System.Data.DataRow> in StoreOrder Column. Expected type is Int64." Observação: StoreOrderé a primeira coluna no esquema da tabela. Parece que ele está tentando colocar o datarow inteiro na primeira coluna
Brian Webster
11

Outra maneira é usar um DataView

// Create a DataTable
DataTable table = new DataTable()
...

// Filter and Sort expressions
string expression = "[Birth Year] >= 1983"; 
string sortOrder = "[Birth Year] ASC";

// Create a DataView using the table as its source and the filter and sort expressions
DataView dv = new DataView(table, expression, sortOrder, DataViewRowState.CurrentRows);

// Convert the DataView to a DataTable
DataTable new_table = dv.ToTable("NewTableName");
ilans
fonte
9

A maneira simples é:

// dtData is DataTable that contain data
DataTable dt = dtData.Select("Condition=1").CopyToDataTable();

// or existing typed DataTable dt
dt.Merge(dtData.Select("Condition=1").CopyToDataTable());
Zolfaghari
fonte
5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   
user1036202
fonte
4
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();
Miriam
fonte
4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();
Rajenthiran T
fonte
3

.Net 3.5+ adicionado DataTableExtensions, use o método DataTableExtensions.CopyToDataTable

Para array datarow apenas use .CopyToDataTable () e ele retornará a tabela de dados.

Para uso em um único datarow

new DataRow[] { myDataRow }.CopyToDataTable()
Haseeb Mukhtar
fonte
2

Aqui está a solução. Deve funcionar bem.

DataTable dt = new DataTable();
dt = dsData.Tables[0].Clone();
DataRows[] drResults = dsData.Tables[0].Select("ColName = 'criteria');

foreach(DataRow dr in drResults)
{
    object[] row = dr.ItemArray;
    dt.Rows.Add(row);
} 
zaib shah
fonte
1

No caso de alguém precisar em VB.NET:

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next
logixologista
fonte
1

Você pode usar System.Linq assim:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}
Andrés
fonte
1

Você precisa clonar a estrutura da tabela de dados primeiro, em seguida, importar as linhas usando o loop for

DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}
Awais Shabir
fonte
0
DataTable dataTable = new DataTable();
dataTable = OldDataTable.Tables[0].Clone();
foreach(DataRow dr in RowData.Tables[0].Rows)
{
 DataRow AddNewRow = dataTable.AddNewRow();
 AddNewRow.ItemArray = dr.ItemArray;
 dataTable.Rows.Add(AddNewRow);
}
AVINASH DUBEY
fonte