Maneira simples de converter matriz datarow em tabela de dados


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.


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)


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);

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");

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());

5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   

4
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();

4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();

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()

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);
} 

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

1

Você pode usar System.Linq assim:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}

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);
}

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);
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.