la copia bulk di sql non caricherà i dati nel database utilizzando il flusso di file

asp.net c# sqlbulkcopy

Domanda

Sto caricando un file tramite un controllo di caricamento file e quindi lo stream reader legge il file itno un datatable e quindi la copia bulk di sql copia il datatable nel mio database sql e riempie le colonne appropriate. Qualcuno vede qualcosa di sbagliato con il codice qui sotto? Non ricevo un messaggio di errore ma sembra che si stia bloccando nel processo IIS. Non posso entrare per cancellare il file csv dalla cartella perché dice che il processo sta ancora funzionando.

    protected void btnUpload_Click(object sender, EventArgs e)
    {

        //upload file to the gencouploadfiles folder
        UploadFile();

        //fetch CSV file from the folder
        string strFilePath = Server.MapPath("GencoUploadFiles") + "\\" + "GencoUploadFile.txt";

        //perform sql bulk copy
        PerformBulkCopy(GencoUpload(strFilePath));

        //delete the file from the folder
    }



    public void UploadFile()
    {
        if (fileUpload1.HasFile)
        {
            FileInfo fileinfo = new FileInfo(fileUpload1.PostedFile.FileName);
            string strCsvFilePath = Server.MapPath("GencoUploadFiles") + "\\" + "GencoUploadFile.txt";
            fileUpload1.SaveAs(strCsvFilePath);
        }
    }


    public static DataTable GencoUpload(string filepath)
    {
        StreamReader sr = new StreamReader(filepath);
        string line = sr.ReadLine();
        string[] value = line.Split('|');
        DataTable dt = new DataTable();
        DataRow row;

        foreach (string dc in value)
        {
            dt.Columns.Add(new DataColumn(dc));
        }

        while (!sr.EndOfStream)
        {
            value = sr.ReadLine().Split('|');
            if (value.Length == dt.Columns.Count)
            {
                row = dt.NewRow();
                row.ItemArray = value;
                dt.Rows.Add(row);
            }
        }
        return dt;
    }


    public void PerformBulkCopy(DataTable dt)
    {
        SqlConnection conStr = new SqlConnection(ConfigurationManager.ConnectionStrings["EDI"].ConnectionString);

        using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conStr.ConnectionString))
        {
            bulkcopy.DestinationTableName = "dbo.GencoUploadTempTable";
            bulkcopy.BatchSize = dt.Rows.Count;
            conStr.Open();
            bulkcopy.WriteToServer(dt);
            bulkcopy.Close();
            conStr.Close();
        }
    }

Risposta popolare

Semplifica il tuo codice; ci sono molti modi per ottenere il csv in un datatable - vedi Come leggere un file CSV in un Datatable .NET per esempio. Nel tuo esempio sopra, non sembra che tu stia chiudendo il flusso dopo aver finito di leggerlo ... aggiungi sr.Close () prima del ritorno, o meglio ancora avvolgi la dichiarazione in una dichiarazione using ():

  public static DataTable GencoUpload(string filepath) 
  { 
        DataTable dt = new DataTable(); 

        using(StreamReader sr = new StreamReader(filepath))
        { 
            string line = sr.ReadLine(); 
            string[] value = line.Split('|'); 

            DataRow row; 

            foreach (string dc in value) 
            { 
                dt.Columns.Add(new DataColumn(dc)); 
            } 

            while (!sr.EndOfStream) 
            { 
                value = sr.ReadLine().Split('|'); 
                if (value.Length == dt.Columns.Count) 
                { 
                    row = dt.NewRow(); 
                    row.ItemArray = value; 
                    dt.Rows.Add(row); 
                } 
            }
        }

        return dt; 
    } 

Questo dovrebbe impedire il blocco del file.

La prossima cosa da guardare è controllare se la tabella dati contiene effettivamente dei dati al suo interno. Inserisci un punto di interruzione e verifica se il codice di caricamento funziona effettivamente; stai aggiungendo le righe a una tabella di dati ma non hai definito la struttura della colonna (cioè hai fornito solo nomi e non tipi di dati in modo da poter ottenere problemi di conversione). Sicuramente sarà più facile usare uno degli altri metodi per caricare il tuo file :-)



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