Utilizzo della copia bulk di SQL in C # ed eliminazione delle intestazioni di stringa

c# datetime sql sqlbulkcopy sql-server

Domanda

Il codice seguente è quello che uso per inserire i dati memorizzati nel file txt in sql:

 public void extract_data()
    {
        openFileDialog1.ShowDialog();
        DataTable dt = new DataTable();
        StreamReader sr = new StreamReader(openFileDialog1.FileName);
        string input;
        dt.Columns.Add(new DataColumn("Counter", typeof(string)));
        dt.Columns.Add(new DataColumn("Machine", typeof(string)));
        dt.Columns.Add(new DataColumn("Employee_Number", typeof(string)));
        dt.Columns.Add(new DataColumn("In_Out", typeof(string)));
        dt.Columns.Add(new DataColumn("DateTime", typeof(string)));
        while ((input = sr.ReadLine()) != null)
        {
            string[] s = input.Split(new char[] { '\t' });
            DataRow dr = dt.NewRow();
            dr["Counter"] = s[0];
            dr["Machine"] = s[1];
            dr["Employee_Number"] = s[2];
            dr["In_Out"] = s[5];
            dr["DateTime"] = s[6];
            dt.Rows.Add(dr);
        }

        using (SqlBulkCopy sqbc = new SqlBulkCopy(@"Data Source=DBASE;Network Library=DBMSSOCN;Initial Catalog=DB;User ID=sa;Password=123"))
        {
            sqbc.BatchSize = 10000;
            sqbc.BulkCopyTimeout = 10000;
            sqbc.ColumnMappings.Add("Counter", "Counter");
            sqbc.ColumnMappings.Add("Machine", "Machine");
            sqbc.ColumnMappings.Add("Employee_Number", "Employee_Number");
            sqbc.ColumnMappings.Add("In_Out", "In_Out");
            sqbc.ColumnMappings.Add("DateTime", "DateTime");
            sqbc.DestinationTableName = "tblExtract";
            sqbc.WriteToServer(dt);
        }
    }

Come puoi vedere, non posso convertire la mia colonna DateTime in data / ora in sqlserver a causa dell'intestazione nel file txt che possiamo classificare come stringhe. La copia bulk restituirà un errore perché non è possibile inserire la stringa nella colonna del formato datetime, quindi sono stato costretto a dichiarare la colonna DateTime alla stringa per adattarla. Ma voglio cambiarlo. Voglio dichiararlo a datetime. Come posso ignorare il testo dell'intestazione mentre faccio la copia di sqlbulk? Voglio saltare il testo dell'intestazione e copiare solo i dati

Risposta accettata

Se si ha sempre una singola riga di intestazione che si desidera saltare, basta leggere quella riga senza elaborarla avvolgendo il proprio while while () all'interno di if ().

if ((input = sr.ReadLine()) != null)
{
     // already read line #1 (i.e. header line),
     // now start processing data, if any lines exist
     while ((input = sr.ReadLine()) != null)
     {
        ...
     }
}

Note generali:

  • Spero che l'account "sa" nella stringa di connessione sia solo un esempio. In caso contrario, utilizzare un altro account. Usare "sa" è una cattiva idea.
  • A seconda delle dimensioni del file di input, questo potrebbe essere piuttosto inefficiente con la memoria poiché è necessario leggere prima l'intero file nel DataTable. Sarebbe meglio creare un TVP (parametro con valori di tabella) in SQL Server, utilizzarlo come parametro di input per un proc che esegue questo inserimento leggendo dal TVP e aggiornando questo codice in modo che ogni riga del file sia leggere e dividere in schede, ogni riga viene inviata a SQL Server in modo da non avere mai più di 1 riga del file di input in memoria.

Risposta popolare

Prova questo :

string format = "MM/dd/yyyy hh:mm:ss.fff";
DateTime d =DteTime.ParseExact(s[6],format,System.Globalization.CultureInfo.InvariantCulture);
dr["DateTime"]=d;

Cambia il formato come vuoi "MM / gg / aaaa" o "MM / gg / aaaa hh: mm" ecc.



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