Yo tengo:
DataTable Table = new DataTable;
SqlConnection = new System.Data.SqlClient.SqlConnection("Data Source=" + ServerName + ";Initial Catalog=" + DatabaseName + ";Integrated Security=SSPI; Connect Timeout=120");
SqlDataAdapter adapter = new SqlDataAdapter("Select * from " + TableName, Connection);
adapter.FillSchema(Table, SchemaType.Source);
adapter.Fill(Table);
DataColumn column = DataTable.Columns[0];
Lo que quiero hacer es:
Suponga que actualmente column.DataType.Name es "Double" . Quiero que se convierta en "Int32" .
¿Cómo logro esto?
c#
types
datacolumn
c#-datatable
rofans91
fuente
fuente
Si bien es cierto que no puede cambiar el tipo de columna después de que
DataTable
se llena, puede cambiarlo después de llamarFillSchema
, pero antes de llamarFill
. Por ejemplo, digamos que la tercera columna es la que desea convertirdouble
aInt32
, podría usar:fuente
Oracle.MangedDataAccess.Client.OracleDataAdapter
con un procedimiento almacenado. Esta funcionando. Gracias.Publicación anterior, pero pensé que lo haría, con una extensión DataTable que puede convertir una sola columna a la vez, a un tipo determinado:
Entonces se puede llamar así:
Por supuesto, use el tipo que desee, siempre que cada valor de la columna pueda convertirse al nuevo tipo.
fuente
public static void ConvertColumnType<T>(this DataTable dt, string columnName, TnewType) where T : Type, IConvertible
dr[dc.ColumnName] = dr[columnName] == DBNull.Value ? DBNull.Value : Convert.ChangeType(dr[columnName], newType);
Considere también modificar el tipo de retorno:
fuente
fuente
He adoptado un enfoque un poco diferente. Necesitaba analizar una fecha y hora de una importación de Excel que estaba en el formato de fecha OA. Esta metodología es lo suficientemente simple para construir a partir de ... en esencia,
Elimine la columna original y cambie el nombre a la nueva para que coincida con la antigua
fuente
Una vez que
DataTable
se ha llenado, no puede cambiar el tipo de columna.Su mejor opción en este escenario es agregar una
Int32
columnaDataTable
antes de llenarla:Luego, puede clonar los datos de su tabla original a la nueva tabla:
Aquí hay una publicación con más detalles .
fuente
si desea cambiar solo una columna. por ejemplo, de cadena a int32, puede usar la propiedad Expression:
fuente
Creé una función de extensión que permite cambiar el tipo de columna de un DataTable. En lugar de clonar toda la tabla e importar todos los datos, simplemente clona la columna, analiza el valor y luego elimina el original.
Puedes usarlo así:
El código anterior cambia todas las columnas decimales a dobles.
fuente
fuente
Combiné la eficiencia de la solución de Mark, por lo que no tengo que
.Clone
usar toda la DataTable , con genéricos y extensibilidad, para poder definir mi propia función de conversión . Esto es con lo que terminé:De esta manera, el uso es mucho más sencillo, aunque también personalizable:
fuente
Puedes agregar una columna con tipo de dato distinto, luego copiar los datos y eliminar la columna anterior
fuente