Type de données de conversion SQL Bulkcopy

c# datetime parsing sqlbulkcopy sql-server

Question

Dans mon projet .Net, je suis en train de charger un fichier CSV pour pouvoir prendre ces données, en faire quelques trucs et les transférer dans un fichier Excel.

Je gère cela via une table de données à l'intérieur de mon code. Dans mon fichier de résultats, j'ai ajouté une nouvelle colonne que j'appelle 'resetdate' et je le fais comme ceci:

nettingTable.Columns.Add("resetdate");

Les données sont nettoyées de toutes les cellules vides et la valeur est définie sur un DBNull afin que ma base de données ne le soit pas par une erreur. Ce code ressemble à ceci:

public DataTable PreProcess(DataTable dt)
{
    foreach (DataColumn col in dt.Columns)
        if (_config.ColumnNames.Contains(col.ColumnName))
        {
            foreach (DataRow row in col.Table.Rows)
            {          
                // We only care about the date
                // This trims out the any time values that may have automatically been added               
                if(row[col].ToString().Length > 10)
                {                               
                    row[col] = row[col].ToString().Substring(0, 10);
                }
                if (row[col].ToString().Length == 0)
                {
                    row[col] = DBNull.Value;
                }
            }
        }
    return dt;
}

Rien de révolutionnaire ici et cela a longtemps fonctionné. Cependant, ma nouvelle colonne, resetdate est destinée à être renseignée à partir d'une colonne de mon fichier CSV appelée nextresetdate ce que je suis en train de faire avec le code suivant:

foreach (DataRow dr in nettingTable.Rows)
{
   dr["resetdate"] = dr["nextresetdate"];
}

Une fois que tout est rempli, il est envoyé à ma base de données où se trouve une table avec une colonne appelée ' ResetDate ' qui a pour valeur ' DateTime '. Encore une fois, tout cela a fonctionné auparavant sans problème.

Désormais, lorsque j'essaie d'exécuter mon code avec les modifications ci-dessus, le message d'erreur suivant s'affiche:

Lignes: 2-453 Erreur: La valeur donnée de type String de la source de données ne peut pas être convertie en type int de la colonne cible spécifiée.

L'exception interne se lit comme suit:

InvalidOperationException: la valeur donnée de type String de la source de données ne peut pas être convertie en type datetime de la colonne cible spécifiée.

J'ai essayé d'amender mon code pour qu'il ressemble à quelque chose comme:

foreach (DataRow dr in nettingTable.Rows)
{
    // this was done both as I've wrote and passing 
    // in the intended value as a variable, same result
     dr["resetdate"] = DateTime.Parse(dr["nextresetdate"]); 
}

Mais je reçois la même erreur. Qu'est-ce que je fais mal ici?

Réponse acceptée

La surcharge de DataColumnCollection::Add() qui prend uniquement un nom de colonne affecte string au type de données de la nouvelle colonne, comme décrit sur ce lien. Avez-vous essayé ce qui suit à la place?

nettingTable.Columns.Add("resetdate", typeof(DateTime));


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi