La définition de la valeur d'un élément dans un DataRow ne fonctionne pas

StackOverflow https://stackoverflow.com/questions/204406

  •  03-07-2019
  •  | 
  •  

Question

J'essaie de convertir toutes les valeurs DateTime d'un DataTable en chaînes. Voici la méthode que j'utilise:

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

Après que cette ligne fonctionne:

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

Je vérifie la valeur de dataTable.Rows [rowIndex] [i] et constate qu'il s'agit toujours d'un DateTime, et non d'une chaîne. Pourquoi cela se produit-il et comment puis-je résoudre ce problème?

Edit: J'essaie de faire cela parce que je me bats contre une API et je n'ai malheureusement pas le choix du composant à utiliser.

Était-ce utile?

La solution

Il a peut-être déterminé que le type de données de la colonne est date-heure et renvoie les valeurs à datetime lorsque vous enregistrez la valeur.

Essayez ceci ... Créez une nouvelle colonne sur le serveur de données en tant que TypeOf (String) et enregistrez la valeur de chaîne dans cette colonne. Lorsque toutes les valeurs ont été copiées, supprimez la colonne date / heure.

Autres conseils

Cela ne fonctionnera tout simplement pas, car vous n'avez pas modifié le type de données sous-jacent.

Vous avez un DataTable, avec une colonne de type de données DateTime.

Vous pouvez lui attribuer une chaîne, mais celle-ci sera reconvertie en DateTime.

Pourquoi voulez-vous le changer en une chaîne formatée? Ne pouvez-vous pas formater uniquement lorsque vous avez besoin de l'afficher, et gérer comme un DateTime jusqu'à ce que vous deviez l'afficher?

Mise à jour: il est également préférable de vérifier le type de la colonne avant d'essayer de convertir, cela peut être beaucoup plus rapide:

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

Cela ne fonctionnera pas car le type de données de la colonne est toujours DateTime et il convertira la chaîne en date / heure. Je suggérerais de formater la date en chaîne lors de la génération de votre message API. Si vous devez toujours générer une colonne de chaîne pour les valeurs 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");
     }
   }
}

Ensuite, vous pouvez supprimer toutes les colonnes DateTime ou utiliser dataTable.Select () pour obtenir uniquement les colonnes dont vous avez besoin. PS: Je n'ai pas testé le code, c'est à vous de voir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top