sqlbulkcopy - Quando si converte la stringa in DateTime

c# csv datetime excel sqlbulkcopy

Domanda

Sto usando questo codice per inserire un file csv nel mio database:

    private void InsertDataIntoSQLServerUsingSQLBulkCopy(DataTable csvFileData)
    {
        using (SqlConnection dbConnection = new SqlConnection(ConnectionString))
        {
            dbConnection.Open();
            using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
            {
                s.DestinationTableName = "tablename";
                foreach (var column in csvFileData.Columns)
                    s.ColumnMappings.Add(column.ToString(), column.ToString());
                s.WriteToServer(csvFileData);
            }
        }
    }


    private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
    {
        DataTable csvData = new DataTable();
        try
        {
            using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
            {
                csvReader.SetDelimiters(new string[] { "," });
                csvReader.HasFieldsEnclosedInQuotes = true;
                string[] colFields = csvReader.ReadFields();
                foreach (string column in colFields)
                {
                    DataColumn datecolumn = new DataColumn(column);
                    datecolumn.AllowDBNull = true;
                    csvData.Columns.Add(datecolumn);

                }
                while (!csvReader.EndOfData)
                {
                    string[] fieldData = csvReader.ReadFields();

                    for (int i = 0; i < fieldData.Length; i++)
                    {
                        if (fieldData[i] == "")
                        {
                            fieldData[i] = null;
                        }
                    }
                    csvData.Rows.Add(fieldData);
                }
            }
        }

Il mio database contiene dati temporanei. Per testare questo codice ho copiato i campi con intestazioni dal server SQL e incollato in un file excel. Ho quindi salvato il file excel in csv e ho eseguito il codice. Aggiunge i dati dal csv al database perfettamente!

Ho quindi provato a eseguire un file csv con valori simili al mio file csv originale e mi ha dato un'eccezione 'String to DateTime'. Quindi so che qualcosa è in corso con le date e so che le colonne excel hanno valore di 'Date'.

Mi sto davvero grattando la testa con questo. Qualunque buon modo di analizzare le colonne con le date?

Risposta popolare

Sto notando alcuni problemi con il tuo codice che potrebbero causare qualche problema.

  1. Non esiste alcuna convalida dello schema del file CSV. È sufficiente prendere qualsiasi dato file CSV e tentare di scriverlo sul server utilizzando qualsiasi intestazione di colonna che ha.
  2. Quando si crea un'istanza DataColumn , il tipo di colonna predefinito sarà System.String . Questo probabilmente sta causando problemi con la tua data.
  3. Non vedo alcuna trasformazione dei dati nel file CSV. Se uno dei campi nella tabella del database è un datetime e si sta tentando di inserire in System.String una colonna System.String , si System.String problemi.

I miei suggerimenti sarebbero i seguenti:

  1. Esegui la convalida dello schema nel file CSV in modo da sapere che stai ricevendo l'input che ti aspetti. Questo è duplice: assicurarsi che i dati siano nel formato previsto e assicurarsi che le intestazioni di colonna previste esistano.
  2. Per la tabella che si inserisce in blocco, creare i tipi di colonna appropriati per le tabelle SQL. Utilizzare l'overload del costruttore DataColumn cui si specifica il tipo di dati della colonna: new DataColumn("Name", typeof(DateTime))
  3. Prendere i dati E xtracted dal CSV (tutti come stringhe) e T ransform in formato richiesto, allora L oad esso.

L'operazione che stai facendo è un ETL molto semplice. Sembra che tu abbia la parte Estrai e Carica funzionante, la cosa che ti manca è il componente Trasforma.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché