Una forma sencilla de convertir una matriz de fila de datos en una tabla de datos

98

Quiero convertir una DataRowmatriz en DataTable... ¿Cuál es la forma más sencilla de hacer esto?

Desarrollador404
fuente

Respuestas:

91

¿Por qué no iterar a través de su matriz DataRow y agregar (usando DataRow.ImportRow, si es necesario, para obtener una copia de DataRow), algo como:

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

Asegúrese de que su dataTable tenga el mismo esquema que DataRows en su matriz DataRow.

Jay Riggs
fuente
1
Esta técnica es útil si recibe el mensaje de error "Se está utilizando una fuente de datos no válida para MyControl. Una fuente de datos válida debe implementar IListSource o IEnumerable" al intentar vincular un DataRow directamente a la propiedad DataSource de un control. He aquí cómo hacerlo:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
Humbads
+1 ¡Prefiero esto en lugar de rowArray.CopyToDataTable();porque mantiene el esquema de la tabla y no lo reemplaza con un nuevo objeto de tabla!
Mojtaba Rezaeian
7
Muy bien ! Pero sugeriría clonar el DataTable antes del foreach. Copia el formato de la DataTable: newDataTable = oldDataTable.clone ();
Latigazo
2
Sugerencia: su tabla de datos debe tener columnas creadas o no se llenará correctamente.
logixólogo
192

Para .Net Framework 3.5+

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

Pero si no hay filas en la matriz, puede causar errores como El origen no contiene DataRows . Por lo tanto, si decide utilizar este método CopyToDataTable(), debe verificar la matriz para saber si tiene filas de datos o no.

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

Referencia disponible en MSDN: Método DataTableExtensions.CopyToDataTable (IEnumerable)

Joe
fuente
1
De dónde sacaste copyToDataTable()? No lo encontré en .net 2.0
SMUsamaShah
11
Esto debe marcarse como una respuesta correcta ya que el copyToDataTable()método crea una copia perfecta de las columnas de las filas seleccionadas, mientras que el datatable.ImportRow(row)método no lo hace
Dante
5
este método no es bueno si la tabla ya tiene filas, ya que reemplaza lo que ya está allí. Si la mesa está vacía para empezar, está bien.
Franck
5
Prefiero este método siempre que las funciones .Net estén optimizadas. No olvide agregar la referencia a System.Data.DataSetExtensions en su proyecto para que no se frustre preguntándose por qué falta este método (como yo)
Broken_Window
Recuerde agregar el ensamblado System.Data.DataSetExtensions en las referencias
Vagner Gon
12
DataTable dt = new DataTable(); 

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

dt.Rows.Add(dr);
Trigo Mitch
fuente
2
Ya lo intenté así ... Se produce un error como "La matriz de entrada es más larga que el número de columnas de esta tabla".
Developer404
Como señaló Jay, asegúrese de que su tabla de datos tenga el mismo esquema que DataRows en su matriz DataRow
Mitch Wheat
1
Sí ... lo intenté. Usé Datatable1 = datatable2.Clone (); Ahora está funcionando ... Gracias :-)
Developer404
Intenté esto con una matriz de filas y no funcionó. Para cada fila en la matriz de filas, creé una nueva fila, copié la propiedad ItemArray de la fila original y luego la adición funcionó.
Steve
1
Esto no parece funcionar en .NET Framework 4.0 con el ejemplo publicado, ni con la clonación de "dt" de dstata.tables [0]. La respuesta de @ joe terminó funcionando para mis propósitos. Error de versión sin clonar: " Input array is longer than the number of columns in this table.". Error de versión con clonación: " 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." Nota: StoreOrderes la primera columna del esquema de la tabla. Parece que está intentando meter toda la fila de datos en esa primera columna
Brian Webster
11

Otra forma es usar un 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
fuente
9

La forma sencilla es:

// 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
fuente
5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   
usuario1036202
fuente
4
DataTable dt = myDataRowCollection.CopyToDataTable<DataRow>();
Miriam
fuente
4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();
Rajenthiran T
fuente
3

.Net 3.5+ agregó DataTableExtensions, use el método DataTableExtensions.CopyToDataTable

Para la matriz de fila de datos, simplemente use .CopyToDataTable () y devolverá la tabla de datos.

Para uso en una sola fila de datos

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

Aqui esta la solucion. Debería funcionar bien.

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
fuente
1

En caso de que alguien lo necesite en VB.NET:

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next
logixólogo
fuente
1

Podrías usar System.Linq así:

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

Primero debe clonar la estructura de la tabla de datos y luego importar las filas usando el bucle for

DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}
Awais Shabir
fuente
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
fuente