SQL Bulkcopy che copre il tipo di dati

c# datetime parsing sqlbulkcopy sql-server

Domanda

Nel mio progetto .Net sto caricando un file CSV in modo da poter prendere quei dati, fare alcune cose con esso, e sparare i risultati in un file excel.

Sto gestendo questo attraverso una tabella di dati all'interno del mio codice. Nel mio file dei risultati, ho aggiunto una nuova colonna che chiamo 'resetdate' e lo faccio in questo modo:

nettingTable.Columns.Add("resetdate");

I dati vengono eliminati dalle celle vuote e il valore impostato su un DBNull modo che il mio database non DBNull un errore. Il codice è simile a questo:

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

Niente di eccezionale qui e questo ha funzionato a lungo. Tuttavia, la mia nuova colonna, resetdate è pensata per essere popolata da una colonna nel mio file CSV chiamato nextresetdate che sto facendo con il seguente codice:

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

Una volta che tutto è stato compilato, viene inviato al mio database dove ho una tabella con una colonna chiamata ' ResetDate ' che ha un valore di ' DateTime '. Di nuovo, tutto ha funzionato prima senza problemi.

Ora, quando provo a eseguire il mio codice con le modifiche di cui sopra, ottengo il seguente messaggio di errore:

Righe: 2-453 Errore: il valore dato di tipo String dall'origine dati non può essere convertito in tipo int della colonna di destinazione specificata.

L'eccezione interna si legge come:

InvalidOperationException: il valore dato di tipo String dall'origine dati non può essere convertito in tipo datetime della colonna di destinazione specificata.

Ho provato a modificare il mio codice per essere qualcosa del tipo:

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

Ma ottengo lo stesso errore. Che cosa sto facendo di sbagliato qui?

Risposta accettata

Il sovraccarico di DataColumnCollection::Add() che richiede solo un nome di colonna assegna una string come tipo di dati per la nuova colonna, come descritto in quel collegamento. Hai provato invece il seguente?

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow