Domanda

Sto cercando di convertire tutti i valori di DateTime in una DataTable in stringhe. Ecco il metodo che 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");
        }
    }
}

Dopo che questa linea funziona:

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

Controllo il valore di dataTable.Rows [rowIndex] [i] e vedo che è ancora un DateTime, non una stringa. Perché succede e come posso risolverlo?

Modifica: sto cercando di farlo perché sto combattendo un API e sfortunatamente non ho la scelta di quale componente usare.

È stato utile?

Soluzione

Potrebbe aver determinato che il tipo di dati della colonna è data e ora e reinserisce i valori in datetime quando si salva di nuovo il valore.

Prova questo ... Creare una nuova colonna sul datatable come TypeOf (String) e salvare il valore di stringa in quella colonna. Quando tutti i valori sono stati copiati, rilasciare la colonna dell'ora della data.

Altri suggerimenti

Questo semplicemente non funzionerà, perché non hai modificato il tipo di dati sottostante.

Hai una DataTable, con una colonna che ha il tipo di dati DateTime.

È possibile assegnare una stringa ad essa, ma verrà riconvertita in DateTime.

Perché vuoi cambiarlo in una stringa formattata? Non è possibile formattare solo quando è necessario visualizzarlo e gestirlo come un DateTime fino a quando non è necessario visualizzarlo?

Aggiornamento: è anche meglio se controlli il tipo di colonna prima di provare a convertire, può essere molto più veloce:

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

Non funzionerà perché il DataType della colonna è ancora DateTime e convertirà la stringa in datetime. Suggerirei di formattare la data in stringa quando si genera il messaggio API. Se hai ancora bisogno di generare una colonna stringa per i valori datetime

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

Quindi è possibile rimuovere tutte le colonne DateTime o utilizzare un dataTable.Select () per ottenere solo le colonne necessarie. PS: Non ho testato il codice, dipende da te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top