Pregunta

Estoy tratando de convertir todos los valores de DateTime en un DataTable a cadenas. Aquí está el método que uso:

private static void ConvertDateTimesToStrings(DataTable dataTable)
{
    if (dataTable == null)
    {
        return;
    }

    for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++ )
    {
        for (int i = 0; i < dataTable.Columns.Count; i++)
        {
            DateTime dateTime;
            try
            {
                dateTime = (DateTime)dataTable.Rows[rowIndex][i];
            }
            catch (InvalidCastException)
            {
                continue;
            }
            dataTable.Rows[rowIndex][i] = dateTime.ToString("dd.MM.yyyy hh:mm:ss");
        }
    }
}

Después de que esta línea funcione:

dataTable.Rows[rowIndex][i] = dateTime.ToString("dd.MM.yyyy hh:mm:ss");

Verifico el valor de dataTable.Rows [rowIndex] [i] y veo que sigue siendo DateTime, no una cadena. ¿Por qué sucede esto y cómo puedo resolverlo?

Editar: estoy tratando de hacer esto porque estoy luchando contra una API y desafortunadamente no tengo la opción de qué componente usar.

¿Fue útil?

Solución

Es posible que haya determinado que el tipo de datos de la columna es fecha y hora y está cambiando los valores a fecha y hora cuando guardas el valor allí.

Prueba esto ... Cree una nueva columna en el datatable como un TypeOf (String), y guarde el valor de la cadena en esa columna. Cuando se hayan copiado todos los valores, suelte la columna de fecha y hora.

Otros consejos

Esto simplemente no funcionará, porque no has cambiado el tipo de datos subyacente.

Tienes un DataTable, con una columna que tiene el tipo de datos DateTime.

Puede asignarle una cadena, pero se convertirá de nuevo a DateTime.

¿Por qué quieres cambiarlo a una cadena formateada? ¿No puede formatear solo cuando necesita mostrarlo y manejar como DateTime hasta que tenga que mostrarlo?

Actualización: también es mejor si marca el tipo de columna antes de intentar la conversión, puede ser mucho más rápido:

if (dataTable.Columns[0].DataType == typeof(DateTime))
{
}

No funcionará porque el DataType de la columna sigue siendo DateTime y convertirá la cadena a datetime. Le sugiero que formatee la fecha a la cadena al generar su mensaje API. Si aún necesita generar una columna de cadena para valores de fecha y hora

foreach (DataColumn column in dataTable.Columns) {
  if (column.DataType == typeof(DateTime)) {
    dataTable.Columns.Add(column.ColumnName + "_string", typeof(string));
  }
}

foreach (DataRow row in dataTable.Rows) {
   foreach (DataColumn column in dataTable.Columns) {
     if (column.DataType == typeof(DateTime)) {
       row[column.ColumnName + "_string"] = row[column.ColumnName].ToString("dd.MM.yyyy hh:mm:ss");
     }
   }
}

Luego puede eliminar todas las columnas de DateTime o usar un dataTable.Select () para obtener solo las columnas que necesita. PD: No probé el código, depende de ti.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top